好的,所以我的users_controller更新操作有这个代码,这是生产和工作,我想知道这行是做什么
@user.attributes = { 'role_ids' => [] }.merge(params[:user])
我不明白这是如何设置role_ids的,如果有更好的方法可以做到这一点
@user是用户,而.attributes中没有role_ids,所以这是如何工作的......这是我的关系
class Role < ActiveRecord::Base
has_many :users, :through => :role_users
has_many :role_users
class User < ActiveRecord::Base
has_many :roles, :through => :role_users
has_many :role_users
class RoleUser < ActiveRecord::Base
belongs_to :role
belongs_to :user
end
和参数
Parameters: {"utf8"=>"✓", "authenticity_token"=>"GV/BbOZdKn7SkzD8zydceVdwA+fga=", "user"=>{"id"=>"629", "company_id"=>"1", "active"=>"1", "role_ids"=>["1", "3", "1"], "notification_ids"=>["1", "2", "3"]}, "company"=>"11", "id"=>"621"}
答案 0 :(得分:2)
我假设这个ui是一系列复选框,名称为role_ids[]
,其中值是规则的id。如果勾选了角色2,3,4的框,则会导致role_ids
参数设置为[2,3,4]
唯一的麻烦就是你想给别人一个角色。如果取消选中所有复选框,则根本不会提交role_ids
参数。
@user.attributes = { 'role_ids' => [] }.merge(params[:user])
确保当没有勾选任何复选框时,用户实际上已删除所有现有角色
答案 1 :(得分:2)
有关此功能如何工作的详细信息,请参阅Hash#merge。这里只是确保如果params[:user][:role_ids]
不存在,那么它将保存一个空数组。
你也可以这样做:
params[:user][:role_ids] ||= []
我认为它更好,更易读。
答案 2 :(得分:2)
下面一行检查role_ids,如果params [:user]中的role_ids然后将其他一个取空数组:
@user.attributes = { 'role_ids' => [] }.merge(params[:user])
表示合并的工作方式如下:
params[:user][:role_ids] = (params[:user].include? 'role_ids') ? params[:user][:role_ids] : []
所以你得到像
这样的role_idsirb(main):026:0> { 'role_ids' => [] }.merge(params[:user])
=> {"role_ids"=>["1", "3", "1"], "id"=>"629", "company_id"=>"1", "active"=>"1", "notification_ids"=>["1", "2", "3"]}
答案 3 :(得分:0)
如果散列中有重复项,则Hash#merge会将作为参数给出的散列中的条目值返回给#merge。你的参数中有一个"role_ids"=>["1", "3", "1"]
,因此role_ids
将被设置为。{/ p>