这条线在我的rails应用程序中做了什么

时间:2012-04-10 13:43:48

标签: ruby-on-rails ruby ruby-on-rails-3

好的,所以我的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"}

4 个答案:

答案 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_ids
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"]}

答案 3 :(得分:0)

如果散列中有重复项,则Hash#merge会将作为参数给出的散列中的条目值返回给#merge。你的参数中有一个"role_ids"=>["1", "3", "1"],因此role_ids将被设置为。{/ p>