0

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

4 回答 4

2

我假设这个用户界面是一系列复选框,名称role_ids[]和值是规则的 id。如果角色 2、3、4 的框被勾选,这将导致role_ids参数设置为[2,3,4]

唯一的麻烦是当你不想给某人任何角色时。如果所有复选框都未选中,则根本不role_ids提交任何参数。

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

确保当没有选中任何复选框时,用户实际上已删除所有现有角色

于 2012-04-10T13:48:24.233 回答
2

有关此函数如何工作的详细信息,请参阅Hash#merge。在这里,它只是确保如果params[:user][:role_ids]不存在,那么它将保存一个空数组。

你也可以这样做:

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

我认为它更好,更易读。

于 2012-04-10T13:48:59.300 回答
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"]}
于 2012-04-10T13:51:17.997 回答
0

如果散列中有重复项,则Hash#merge将作为参数提供给 #merge 的散列中的条目的值返回。您的参数中有 a "role_ids"=>["1", "3", "1"],因此role_ids将设置为该参数。

于 2012-04-10T13:53:30.667 回答