it-swarm.com.de

ActiveModel :: ForbiddenAttributesError beim Erstellen eines neuen Benutzers

Ich habe dieses Modell in Ruby aber es wirft einen ActiveModel::ForbiddenAttributesError

class User < ActiveRecord::Base
  attr_accessor :password
  validates :username, :presence => true, :uniqueness => true, :length => {:in => 3..20}
  VALID_EMAIL_REGEX = /\A[\w+\-.][email protected][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

wenn ich diese Aktion ausführen

  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

on Ruby 1.9.3p194 (2012-04-20 revision 35410) [x86_64-linux].

Können Sie mir bitte sagen, wie ich diesen Fehler beseitigen oder ein ordnungsgemäßes Benutzerregistrierungsformular erstellen kann?

217
LeMike

Ich vermute, Sie verwenden Rails 4. In diesem Fall müssen die erforderlichen Parameter als erforderlich markiert werden.

Vielleicht möchten Sie es so machen:

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

Für diejenigen, die CanCan verwenden . Leute können dieses erfahren, wenn sie CanCan mit Schienen 4 + benutzen. Versuchen Sie AntonTrapps ziemlich saubere Umgehungslösung hier , bis CanCan aktualisiert wird:

In der ApplicationController:

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

und im Resource Controller (zum Beispiel NoteController):

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

Update:

Hier ist ein Fortsetzungsprojekt für CanCan mit dem Namen CanCanCan , das vielversprechend aussieht:

CanCanCan

64
mjnissim

Es gibt eine einfachere Möglichkeit, die starken Parameter überhaupt zu vermeiden. Sie müssen lediglich die Parameter in einen regulären Hash konvertieren.

unlocked_params = ActiveSupport::HashWithIndifferentAccess.new(params)

model.create!(unlocked_params)

Dies macht natürlich den Zweck starker Parameter zunichte, aber wenn Sie sich in einer Situation wie der meinen befinden (ich verwalte die zulässigen Parameter in einem anderen Teil meines Systems selbst), wird dies die Arbeit erledigen.

23
Wilker Lucio

Wenn Sie ActiveAdmin verwenden, vergessen Sie nicht, dass im Modellregisterblock auch allow_params enthalten ist:

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

Diese müssen zusammen mit denen im Controller eingestellt werden:

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

Andernfalls erhalten Sie den Fehler:

ActiveModel::ForbiddenAttributesError
20
StuR

Für diejenigen, die CanCanCan verwenden:

Sie erhalten diesen Fehler, wenn CanCanCan die richtige params-Methode nicht finden kann.

Bei der Aktion :create Versucht CanCan, eine neue Instanz mit bereinigten Eingaben zu initialisieren, indem überprüft wird, ob Ihr Controller auf die folgenden Methoden reagiert (in der angegebenen Reihenfolge):

  1. create_params
  2. <model_name>_params Wie article_params (dies ist die Standardkonvention in Rails zur Benennung Ihrer param-Methode)
  3. resource_params (Eine generisch benannte Methode, die Sie in jedem Controller angeben können)

Zusätzlich kann load_and_authorize_resource Jetzt die Option param_method Verwenden, um eine benutzerdefinierte Methode im Controller anzugeben, die ausgeführt werden soll, um die Eingabe zu bereinigen.

Sie können die Option param_method Mit einem Symbol verknüpfen, das dem Namen einer Methode entspricht, die aufgerufen wird:

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

quelle: https://github.com/CanCanCommunity/cancancan#strong-parameters

14
Andreas

Alternativ können Sie auch Protected Attributes gem verwenden. Dies verhindert jedoch, dass starke Parameter erforderlich sind. Wenn Sie jedoch eine ältere App aktualisieren, bieten geschützte Attribute eine einfache Möglichkeit zum Aktualisieren, bis Sie das Attribut attr_accessible auf starke Parameter umgestalten können.

3
Brian Dear