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?
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
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:
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.
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
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):
create_params
<model_name>_params
Wie article_params (dies ist die Standardkonvention in Rails zur Benennung Ihrer param-Methode)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
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.