web-dev-qa-db-ja.com

新しいユーザーを作成するときのActiveModel :: ForbiddenAttributesError

私は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]上。

このエラーを取り除く、または適切なユーザー登録フォームを確立する方法を教えてください。

217
LeMike

私はあなたがRails 4を使っていると思います。もしそうなら、必要なパラメータはrequiredとマークされなければなりません。

あなたはこのようにしたいかもしれません:

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
387
Domon

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のための継続プロジェクトです。

CanCanCan

64
mjnissim

Strong Parametersを避けるためのもっと簡単な方法があります。次のように、単にパラメータを通常のハッシュに変換する必要があります。

unlocked_params = ActiveSupport::HashWithIndifferentAccess.new(params)

model.create!(unlocked_params)

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

23
Wilker Lucio

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
20
StuR

CanCanCanを使っている人のために:

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

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

  1. create_params
  2. article_paramsのような<model_name>_params(これはあなたのparamメソッドを命名するためのRailsのデフォルトの規約です)
  3. resource_params(各コントローラーで指定できる総称のメソッド)

さらに、load_and_authorize_resourceparam_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#strong-parameters

14
Andreas

別の方法として、 Protected Attributes gem を使用することもできますが、これは強力なパラメータを要求するという目的に反します。ただし、古いアプリをアップグレードする場合は、attr_accessibleを強力なパラメータにリファクタリングできるようになるまでは、Protected Attributesを使用すると簡単にアップグレードできます。

3
Brian Dear