2012-04-10 80 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將被設置爲。

相關問題