分配角色不是插入到其对应的模型
Assigning role is not inserting to its corresponding model
我正在实施为用户分配角色。我已经通过关联实现了这一点。该要求表示特定用户可以有任意数量的角色。已经创建了用户、角色模型并将这两者与用户角色模型相关联。当我将角色分配给特定用户时,它不会保存在我的用户角色 table 中。我的代码如下
//index.html.erb 用户模型
我正在使用用户模型的 index.html.erb 以下代码调用分配角色页面,我在用户角色模型 new.html.erb 的 URL 中获取用户 ID,所以没有得到用户 ID 不是我的问题。
<pre>
<%= link_to t('.assign_role', default: t("helpers.links.assign")),
new_user_role_path(user_id: user.id,user_name: user.first_name),
method: :get,
class: 'btn btn-default btn-xs' %>
</pre>
//new.html.erb
<h1>Assign Roles to <%=params[:user_name ]%></h1>
<%= form_for @user_role, :html => { :class => "form-horizontal user" } do |f| %>
<div class="form-group">
<%= f.label :Assign_Role_1, :class => 'control-label col-lg-2' %>
<div class="col-lg-10" >
<%= f.select(:role_id, Role.all.map{|e| [e.name, e.id]},{ :include_blank => "Please select" }, { class: 'form-control' } ) %>
</div>
<%=f.error_span(:Assign_Role) %>
</div>
<div class="form-group">
<div class="col-lg-offset-2 col-lg-10">
<%= f.submit nil, :class => 'btn btn-primary' %>
<%= link_to t('.cancel', :default => t("helpers.links.cancel")),
users_path, :class => 'btn btn-default' %>
</div>
</div>
<% end %>
//控制器
class UserRolesController < ApplicationController
def index
@user_role = UserRole.all
end
def new
@user_role = UserRole.new
end
def create
@user_role = UserRole.new(user_role_params)
if UserRole.exists?(user_id: user_role_params[:user_id])
flash[:error] = "User already exists."
redirect_to '/' and return
end
if @user_role.save
flash[:success] = "New UserRole created."
redirect_to @user_role
else
render 'new'
end
end
def edit
end
def destroy
end
def show
@user_role = UserRole.all
end
private
def user_role_params
params.require(:user_role).permit( :role_id,:user_id
)
end
结束
我的table
create_table "user_roles", force: :cascade do |t|
t.integer "role_id"
t.integer "user_id"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.index ["role_id"], name: "index_user_roles_on_role_id"
t.index ["user_id"], name: "index_user_roles_on_user_id"
end
由于我是 ruby 的婴儿并且是 rails 的新生儿,请指导我,即使它是愚蠢的错误。
根据您的评论,我认为您没有将 user_id 传递给控制器。尝试如下操作:
def new
# Get the user somehow
user = User.find_by(name: params[:user_name])
# associate the new role with the user
@user_role = user.user_roles.new
end
def create
# Get the user somehow
user = User.find_by(name: params[:user_name])
# associate the new role with the user
@user_role = user.user_roles.new(user_role_params)
if @user_role.save
flash[:success] = "New UserRole created."
redirect_to @user_role
else
render 'new'
end
end
您可能需要对此进行试验,因为您的设置有点不寻常。但你会到达那里:)。祝你好运。
如果您在表单中得到 user_id,请在您的表单中尝试以下代码
<h1>Assign Roles to <%=params[:user_name ]%></h1>
<%= form_for @user_role, :html => { :class => "form-horizontal user" } do |f| %>
<%= f.hidden_field :user_id, value: @user_id %>
<div class="form-group">
<%= f.label :Assign_Role_1, :class => 'control-label col-lg-2' %>
<div class="col-lg-10" >
<%= f.select(:role_id, Role.all.map{|e| [e.name, e.id]},{ :include_blank => "Please select" }, { class: 'form-control' } ) %>
</div>
<%=f.error_span(:Assign_Role) %>
</div>
<div class="form-group">
<div class="col-lg-offset-2 col-lg-10">
<%= f.submit nil, :class => 'btn btn-primary' %>
<%= link_to t('.cancel', :default => t("helpers.links.cancel")),
users_path, :class => 'btn btn-default' %>
</div>
</div>
<% end %>
在你的控制器中
def new
@user_id = params[:user_id]
@user_role = UserRole.new
end
def create
@user_role = UserRole.new(user_role_params)
if UserRole.exists?(user_id: user_role_params[:user_id])
flash[:error] = "User already exists."
redirect_to '/' and return
end
if @user_role.save
flash[:success] = "New UserRole created."
redirect_to @user_role
else
render 'new'
end
end
private
def user_role_params
params.require(:user_role).permit( :role_id,:user_id
)
end
不要检查角色,而是在您的用户角色模型中添加验证,如下所示
validates :role_id, uniqueness: { scope: :user_id }
或者如果可能,不要在 select 框中显示该用户已经存在的角色
我正在实施为用户分配角色。我已经通过关联实现了这一点。该要求表示特定用户可以有任意数量的角色。已经创建了用户、角色模型并将这两者与用户角色模型相关联。当我将角色分配给特定用户时,它不会保存在我的用户角色 table 中。我的代码如下 //index.html.erb 用户模型
我正在使用用户模型的 index.html.erb 以下代码调用分配角色页面,我在用户角色模型 new.html.erb 的 URL 中获取用户 ID,所以没有得到用户 ID 不是我的问题。
<pre>
<%= link_to t('.assign_role', default: t("helpers.links.assign")),
new_user_role_path(user_id: user.id,user_name: user.first_name),
method: :get,
class: 'btn btn-default btn-xs' %>
</pre>
//new.html.erb
<h1>Assign Roles to <%=params[:user_name ]%></h1>
<%= form_for @user_role, :html => { :class => "form-horizontal user" } do |f| %>
<div class="form-group">
<%= f.label :Assign_Role_1, :class => 'control-label col-lg-2' %>
<div class="col-lg-10" >
<%= f.select(:role_id, Role.all.map{|e| [e.name, e.id]},{ :include_blank => "Please select" }, { class: 'form-control' } ) %>
</div>
<%=f.error_span(:Assign_Role) %>
</div>
<div class="form-group">
<div class="col-lg-offset-2 col-lg-10">
<%= f.submit nil, :class => 'btn btn-primary' %>
<%= link_to t('.cancel', :default => t("helpers.links.cancel")),
users_path, :class => 'btn btn-default' %>
</div>
</div>
<% end %>
//控制器
class UserRolesController < ApplicationController
def index
@user_role = UserRole.all
end
def new
@user_role = UserRole.new
end
def create
@user_role = UserRole.new(user_role_params)
if UserRole.exists?(user_id: user_role_params[:user_id])
flash[:error] = "User already exists."
redirect_to '/' and return
end
if @user_role.save
flash[:success] = "New UserRole created."
redirect_to @user_role
else
render 'new'
end
end
def edit
end
def destroy
end
def show
@user_role = UserRole.all
end
private
def user_role_params
params.require(:user_role).permit( :role_id,:user_id
)
end
结束
我的table
create_table "user_roles", force: :cascade do |t|
t.integer "role_id"
t.integer "user_id"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.index ["role_id"], name: "index_user_roles_on_role_id"
t.index ["user_id"], name: "index_user_roles_on_user_id"
end
由于我是 ruby 的婴儿并且是 rails 的新生儿,请指导我,即使它是愚蠢的错误。
根据您的评论,我认为您没有将 user_id 传递给控制器。尝试如下操作:
def new
# Get the user somehow
user = User.find_by(name: params[:user_name])
# associate the new role with the user
@user_role = user.user_roles.new
end
def create
# Get the user somehow
user = User.find_by(name: params[:user_name])
# associate the new role with the user
@user_role = user.user_roles.new(user_role_params)
if @user_role.save
flash[:success] = "New UserRole created."
redirect_to @user_role
else
render 'new'
end
end
您可能需要对此进行试验,因为您的设置有点不寻常。但你会到达那里:)。祝你好运。
如果您在表单中得到 user_id,请在您的表单中尝试以下代码
<h1>Assign Roles to <%=params[:user_name ]%></h1>
<%= form_for @user_role, :html => { :class => "form-horizontal user" } do |f| %>
<%= f.hidden_field :user_id, value: @user_id %>
<div class="form-group">
<%= f.label :Assign_Role_1, :class => 'control-label col-lg-2' %>
<div class="col-lg-10" >
<%= f.select(:role_id, Role.all.map{|e| [e.name, e.id]},{ :include_blank => "Please select" }, { class: 'form-control' } ) %>
</div>
<%=f.error_span(:Assign_Role) %>
</div>
<div class="form-group">
<div class="col-lg-offset-2 col-lg-10">
<%= f.submit nil, :class => 'btn btn-primary' %>
<%= link_to t('.cancel', :default => t("helpers.links.cancel")),
users_path, :class => 'btn btn-default' %>
</div>
</div>
<% end %>
在你的控制器中
def new
@user_id = params[:user_id]
@user_role = UserRole.new
end
def create
@user_role = UserRole.new(user_role_params)
if UserRole.exists?(user_id: user_role_params[:user_id])
flash[:error] = "User already exists."
redirect_to '/' and return
end
if @user_role.save
flash[:success] = "New UserRole created."
redirect_to @user_role
else
render 'new'
end
end
private
def user_role_params
params.require(:user_role).permit( :role_id,:user_id
)
end
不要检查角色,而是在您的用户角色模型中添加验证,如下所示
validates :role_id, uniqueness: { scope: :user_id }
或者如果可能,不要在 select 框中显示该用户已经存在的角色