2012-04-10 78 views
0

行,所以我都用了这个代码我users_controller更新的动作,这是在生产和工作,我想知道这条线是做什么是此行中我的Rails应用程序做

@user.attributes = { 'role_ids' => [] }.merge(params[:user]) 

和我不明白这是怎么设置role_ids,如果有更好的方法来做到这一点

@user是用户与不必须在它role_ids .attributes那么,这如何工作....这里是我的关系

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 

和PARAMS是

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"} 

回答

2

下面一行检查role_ids,如果PARAMS role_ids [:用户]然后采取其他人采取空数组:

@user.attributes = { 'role_ids' => [] }.merge(params[:user]) 

手段合并类工程:

params[:user][:role_ids] = (params[:user].include? 'role_ids') ? params[:user][:role_ids] : [] 

所以你得到role_id like

irb(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"]} 
+0

所以params [:user]被修改 – Trace 2012-04-10 13:56:03

+0

编辑我的答案,请看看。 – Vik 2012-04-10 13:58:58

+0

没有参数[:用户]不会改变,它会返回新的散列。在控制台上试试相同的东西 – Vik 2012-04-10 14:07:08

2

我假设这种情况的UI是一系列的复选框,名称为role_ids[]以及其中值是规则的ID。如果勾选了角色2,3,4的框,则会导致参数role_ids设置为[2,3,4]

唯一的小问题是当您想给某个人没有角色时。如果所有复选框都未选中,则根本没有提交role_ids参数。

@user.attributes = { 'role_ids' => [] }.merge(params[:user]) 

确保当没有复选框的勾选被用户实际拥有其所有现有角色的去除

+0

在合并之后,params [:user]被修改 – Trace 2012-04-10 13:56:27

+0

no - 合并返回一个通过在其参数(params [:user])中添加键/ valyes而形成的新散列到{'role_ids => []} – 2012-04-10 14:01:35

2

Hash#merge有关如何此功能工作的细节。这里只是确保如果params[:user][:role_ids]不存在,那么它会保存一个空数组。

你可以这样来做太:

params[:user][:role_ids] ||= [] 

我认为这是更漂亮和可读性。

+0

我认为你的意思是'|| ='。 – tsherif 2012-04-10 13:50:41

+0

对,我编辑! – Cydonia7 2012-04-10 13:51:08

0

如果在哈希中有重复,那么Hash#merge ret将散列中的条目的值作为参数给予#merge。你的参数中有一个"role_ids"=>["1", "3", "1"],因此role_ids将被设置为。

相关问题