0

レールはかなり新しいので、何か誤解したことがある場合はご容赦ください。以下のようなユーザーモデルがあります。理想的には、通常のユーザーはパスワードを更新することしかできませんが、管理者はユーザー名や電子メールなどを変更できます...

class User < ActiveRecord::Base
  # Default auths
  attr_accessible :password, :password_confirmation, :remember_me
  # Admin auths
  attr_accessible :login, :username, :email, :password, :password_confirmation, :remember_me, :role_ids, :as => :admin
end

管理者としてレコードを更新するには、次のようにします。

@user.update_attributes(params[:user], :as => :admin)

しかし、非管理者としてユーザーレコードを更新したいとします。

@user.update_attributes(params[:user])

次の例外が発生します。

ActiveModel::MassAssignmentSecurity::Error in UsersController#update
Can't mass-assign protected attributes: email, username

私がしたいのは、アクセスできないパラメータを無視し、アクセス可能な属性のみを更新することですが、現在、更新全体が失敗します。これは可能ですか、そしてもっと重要なことに、これは物事を行うための推奨される方法ですか?update_attributesを呼び出す前に、アクセスできないパラメーターを手動で削除する方がよいでしょうか。

4

1 に答える 1

0

あなたができることの1つは設定されています

config.active_record.mass_assignment_sanitizer = :logger

これにより、をスローする代わりに、フィルタリングされた属性がログに記録されますActiveModel::MassAssignmentSecurity::Error

または、サイレントに失敗するようActiveModel::MassAssignmentSecurity::Sanitizerにカスタマイズして、独自のサニタイザーを作成することもできます。process_removed_attributes

その他の質問は

...これは物事を行うための推奨される方法ですか?update_attributesを呼び出す前に、アクセスできないパラメーターを手動で削除する方がよいでしょうか。

一部の役割では拒否され、他の役割では拒否されないフィールドを含むフォームの送信を許可する理由を検討する必要があると思います。たとえば、通常のユーザーUsernameがフォームのテキストフィールドを表示/変更できるようattr_accessibleにすることは、その役割でその属性が省略されている場合は意味がありません。

代わりに、管理者ではないユーザーの非管理者フィールドを非表示にし、:strictサニタイザーをそのままにしておく必要があります。ActiveModel::MassAssignmentSecurity::Errorが発生するのは、誰かがDOMを変更していて、提供されていないために関連モデルの変更が許可されていないフィールドを送信しようとした場合のみです。

于 2012-08-21T20:57:12.013 に答える