0

わかりましたので、users_controller update アクションにはこのコードがあり、これは本番環境で動作しており、この行が何をしているのか知りたいです

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

これがどのようにrole_idsを設定しているのか理解できません。これを行うためのより良い方法があるかどうか

@user は 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 をチェックします。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 に答える
2

これのUIは一連のチェックボックスであり、名前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 に答える
0

ハッシュに重複がある場合、Hash#mergeは #merge のパラメーターとして指定されたハッシュのエントリの値を返します。"role_ids"=>["1", "3", "1"]あなたのパラメータにはaがあるので、role_idsそれに設定されます。

于 2012-04-10T13:53:30.667 に答える