42

Rails 4 への最近のアップグレードでは、以下に似たコードを使用して属性を更新しても機能せず、ActiveModel::ForbiddenAttributesエラーが発生します。

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

ユーザーがモデルに次の attr_accessible 行を持っている場所:

attr_accessible :role_ids, :as =>admin
# or any attribute other than :role_ids contained within :user

Rails 4 で同じタスクをどのように達成しますか?

4

5 に答える 5

37

新しい Rails 4 サイトを作成すると、生成されたコントローラーに、サニタイズされたパラメーターを受け取るために使用するプライベート メソッドが含まれていることがわかります。これはいいイディオムで、次のようになります。

private

  def user_params
    params.require(:user).permit(:username, :email, :password)
  end

一括割り当てを許可する古い方法は、次のようなものを使用することでした:

attr_accessible :username, :email, :password

モデルで、特定のパラメーターをアクセス可能としてマークします。

アップグレード中

アップグレードするには、いくつかのオプションがあります。最善の解決策は、コントローラーを params メソッドでリファクタリングすることです。ただし、これは今の時間よりも多くの作業になる可能性があります。

Protected_attributes ジェム

別の方法は、attr_accessible メソッドを復活させる protected_attributes gem を使用することです。これにより、アップグレード パスがわずかにスムーズになりますが、大きな注意点が 1 つあります。

主な警告

ただし、Rails 3 では、attr_accessible 呼び出しのないモデルはすべての属性を許可していました。

protected_attributes gem を使用する Rails 4 では、この動作が逆になります。attr_accessible 呼び出しのないモデルでは、すべての属性が制限されています。すべてのモデルで attr_accessible を宣言する必要があります。これは、attr_accessible を使用していない場合は、これをすべてのモデルに追加する必要があることを意味します。これは、単に params メソッドを作成するのと同じくらいの作業になる可能性があります。

https://github.com/rails/protected_attributes

于 2013-12-18T13:11:03.643 に答える
9

この問題は、Cancan gemが原因である可能性もあります

application_controller.rb に追加するだけです

before_filter do
  resource = controller_name.singularize.to_sym
  method = "#{resource}_params"
  params[resource] &&= send(method) if respond_to?(method, true)
end

ここから取得したコードをさらに変更することなく動作します: https://github.com/ryanb/cancan/issues/835#issuecomment-18663815

于 2014-01-24T10:46:10.900 に答える
-2
def create
  @user = User.create(user_params)
  ....
end

def update
  @user = User.find(params[:id])
  if @user.update_attributes(blog_params)
    redirect_to home_path, notice:  "Your profile has been successfully updated."
  else
    render action: "edit"
  end
end

private
  def user_params
    params.require(:user).permit(:name, :age, :others)
  end
于 2014-12-14T16:39:40.583 に答える