238

私はRubyでこのモデルを持っていますが、それはActiveModel::ForbiddenAttributesError

class User < ActiveRecord::Base
  attr_accessor :password
  validates :username, :presence => true, :uniqueness => true, :length => {:in => 3..20}
  VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i
  validates :email, presence: true, :uniqueness => true, format: { with: VALID_EMAIL_REGEX }

  validates :password, :confirmation => true
  validates_length_of :password, :in => 6..20, :on => :create

  before_save :encrypt_password
  after_save :clear_password

  def encrypt_password
    if password.present?
      self.salt = BCrypt::Engine.generate_salt
      self.encrypted_password= BCrypt::Engine.hash_secret(password, salt)
    end
  end

  def clear_password
    self.password = nil
  end
end

このアクションを実行すると

  def create
    @user = User.new(params[:user])
    if @user.save
      flash[:notice] = "You Signed up successfully"
      flash[:color]= "valid"
    else
      flash[:notice] = "Form is invalid"
      flash[:color]= "invalid"
    end
    render "new"
  end

オンruby 1.9.3p194 (2012-04-20 revision 35410) [x86_64-linux]

このエラーを解消する方法、または適切なユーザー登録フォームを作成する方法を教えてください。

4

8 に答える 8

422

Rails 4 を使用していると思います。その場合、必要なパラメーターを必須としてマークする必要があります。

次のようにするとよいでしょう:

class UsersController < ApplicationController

  def create
    @user = User.new(user_params)
    # ...
  end

  private

  def user_params
    params.require(:user).permit(:username, :email, :password, :salt, :encrypted_password)
  end
end
于 2013-06-27T06:21:16.810 に答える
65

CanCan を使用している方へRails 4+でCanCanを使用している場合、この問題が発生する可能性があります。CanCan が更新されるまで、ここでAntonTrapps のかなりクリーンな回避策を試してください。

ApplicationController

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

およびリソースコントローラー (NoteController など) で:

private
def note_params
  params.require(:note).permit(:what, :ever)
end

アップデート:

これは、有望に見えるCanCanCanと呼ばれる CanCan の継続プロジェクトです。

カンカンカン

于 2013-09-12T14:08:36.667 に答える
25

強力なパラメーターをまったく回避する簡単な方法があります。次のように、パラメーターを通常のハッシュに変換するだけです。

unlocked_params = ActiveSupport::HashWithIndifferentAccess.new(params)

model.create!(unlocked_params)

もちろん、これは強力なパラメーターの目的を無効にしますが、私のような状況にある場合 (システムの別の部分で許可されたパラメーターを独自に管理している場合)、これで作業が完了します。

于 2015-04-14T18:07:11.317 に答える
24

ActiveAdmin を使用している場合は、モデル レジスタ ブロックに permit_params があることも忘れないでください。

ActiveAdmin.register Api::V1::Person do
  permit_params :name, :address, :etc
end

これらは、コントローラー内のものと一緒に設定する必要があります。

def api_v1_person_params
  params.require(:api_v1_person).permit(:name, :address, :etc)
end

そうしないと、次のエラーが発生します。

ActiveModel::ForbiddenAttributesError
于 2014-03-26T17:55:40.987 に答える
24

CanCanCanを使用している場合:

CanCanCan が正しいparams メソッドを見つけられない場合、このエラーが発生します。

アクションの場合:create、CanCan は、コントローラーが次のメソッドに (順番に) 応答するかどうかを確認して、サニタイズされた入力で新しいインスタンスを初期化しようとします。

  1. create_params
  2. <model_name>_paramsarticle_params など (これは、param メソッドに名前を付けるための Rails のデフォルトの規則です)
  3. resource_params(各コントローラーで指定できる一般的な名前のメソッド)

さらに、入力をサニタイズするために実行するコントローラーでカスタム メソッドを指定するオプションをload_and_authorize_resource使用できるようになりました。param_method

param_method呼び出されるメソッドの名前に対応するシンボルにオプションを関連付けることができます。

class ArticlesController < ApplicationController
  load_and_authorize_resource param_method: :my_sanitizer

  def create
    if @article.save
      # hurray
    else
      render :new
    end
  end

  private

  def my_sanitizer
    params.require(:article).permit(:name)
  end
end

ソース: https://github.com/CanCanCommunity/cancancan#33-strong-parameters

于 2017-02-06T14:42:27.273 に答える
0

Rails 4 を使用していてこのエラーが発生した場合enum、次のようなシンボルで定義したモデルで を使用している場合に発生する可能性があります。

class User
  enum preferred_phone: [:home_phone, :mobile_phone, :work_phone]
end

フォームは、ラジオセレクターを文字列パラメーターとして渡します。それが私の場合に起こったことです。enum簡単な修正は、記号の代わりに文字列に変更することです

enum preferred_phone: %w[home_phone mobile_phone work_phone]
# or more verbose
enum preferred_phone: ['home_phone', 'mobile_phone', 'work_phone']
于 2020-01-28T20:15:44.650 に答える