[英]Setting has_many :through with a form on rails 3
I'm trying to create user roles for my user using a form, 我正在尝试使用表单为用户创建用户角色,
<%= form_for @user do |f| %>
<%= f.error_messages %>
<p>
<%= f.label :username %><br />
<%= f.text_field :username %>
</p>
<p>
<%= f.label :email, "Email Address" %><br />
<%= f.text_field :email %>
</p>
<p>
<%= f.label :password %><br />
<%= f.password_field :password %>
</p>
<p>
<%= f.label :password_confirmation, "Confirm Password" %><br />
<%= f.password_field :password_confirmation %>
</p>
<% # f.select :roles, Role.all.map {|r| [r.title]} %>
<% Role.all.each do |role| %>
<div>
<%= check_box_tag :role_ids, role.id, @user.roles.include?(role), :name => 'user[role_ids][]' -%>
<%= label_tag :role_ids, role.title -%>
</div>
<% end -%>
<p><%= f.submit (@user.new_record? ? "Sign up" : "Update"), :id => :sign_up %></p>
<% end %>
This is the association that I have in my model 这是我模型中的关联
class user < ActiveRecord::Base
has_many :assignments
has_many :roles, :through => :assignments
end
class assignment < ActiveRecord::Base
belongs_to :user
belongs_to :role
end
class role < ActiveRecord::Base
has_many :assignments
has_many :users, :through => :assignments
end
What's the way to create the assignment between the user and the role by using the form that I presented in the beginning ? 通过使用我一开始介绍的表单在用户和角色之间创建分配的方式是什么?
My create action in my user controller looks like: 我在用户控制器中的创建动作如下所示:
def create
@user = User.new(params[:user])
if @user.save
session[:user_id] = @user.id
render :action => 'dashboard'
else
render :action => 'new'
end
end
When I send my form I get the error: 当我发送表格时,出现错误:
ActiveRecord::AssociationTypeMismatch in UsersController#create UsersController#create中的ActiveRecord :: AssociationTypeMismatch
Role(#70331681817580) expected, got String(#70331650003400) 预期角色(#70331681817580),得到的字符串(#70331650003400)
Request
Parameters:
{"utf8"=>"✓",
"authenticity_token"=>"WHpOW+DmymZ2pWmY9NHSuodf2vjyKdgMNZcc8NvCNa0=",
"user"=>{"username"=>"ioio",
"email"=>"ioio@ioio.com",
"password"=>"[FILTERED]",
"password_confirmation"=>"[FILTERED]",
"roles"=>["2"]}, #### <<< ==== This is the checkbox that I selected for this request.
"commit"=>"Sign up"}
Any help is welcome. 欢迎任何帮助。
Using your current form and based on: 使用当前表格并基于:
<%= check_box_tag :role_ids, role.id, @user.roles.include?(role), :name => 'user[role_ids][]' -%>
On submit, your params should look like (note 'role_ids' and not 'roles'): 在提交时,您的参数应该看起来像(注意'role_ids'而不是'roles'):
Request
Parameters:
{"utf8"=>"✓",
"authenticity_token"=>"WHpOW+DmymZ2pWmY9NHSuodf2vjyKdgMNZcc8NvCNa0=",
"user"=>{"username"=>"ioio",
"email"=>"ioio@ioio.com",
"password"=>"[FILTERED]",
"password_confirmation"=>"[FILTERED]",
"role_ids"=>["2"]}, #### <<< ==== This is the checkbox that I selected for this request.
"commit"=>"Sign up"}
if this is the case, you will have to instance your roles and set them for the user in the controller: 如果是这种情况,则必须实例化角色并在控制器中为用户设置它们:
def create
@user = User.new(params[:user])
roles = Role.find(params[:user][:role_ids]) rescue []
@user.roles = roles
if @user.save
session[:user_id] = @user.id
render :action => 'dashboard'
else
render :action => 'new'
end
end
...and similarly: ...并类似地:
def update
@user = User.where(:username=>params[:id]).first
roles = Role.find(params[:user][:role_ids]) rescue []
@user.roles = roles
if @user.update_attributes(params[:user])
redirect_to users_url, :notice => "Successfully updated user."
else
render :action => 'edit'
end
end
The error message gives you the hint: To be able to save the user object you first need to create the associated Role objects somehow. 该错误消息为您提供了提示:为了能够保存用户对象,您首先需要以某种方式创建关联的Role对象。 At the moment you only have an array of strings that are Role ids.
目前,您只有一个包含角色ID的字符串数组。
You need to use the accepts_nested_attributes_for method on the user model. 您需要在用户模型上使用accepts_nested_attributes_for方法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.