У меня есть эта модель в 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]
.
Подскажите, пожалуйста, как избавиться от этой ошибки или создать правильную форму регистрации пользователя?
protected_attributes
драгоценный камень для использованияattr_accessible
.Ответы:
Я предполагаю, что вы используете Rails 4. Если это так, необходимые параметры должны быть помечены как требуется.
Возможно, вы захотите сделать это так:
источник
strong_parameter
жемчужиной. Он описан в Руководствах по Rails: guides.rubyonrails.org/… .Для тех, кто использует CanCan . Люди могут испытывать это, если они используют CanCan с Rails 4+ . Попробуйте AntonTrapps в довольно чистое решение обходного пути здесь до тех пор , пока CanCan обновляется:
В
ApplicationController
:и в контроллере ресурсов (например, NoteController):
Обновить:
Вот продолжение проекта для CanCan под названием CanCanCan , которое выглядит многообещающим:
CanCanCan
источник
load_resource
или использованиеload_resource :except => :create
решило проблему. Проверьте оригинальный ответ здесьСуществует более простой способ избежать Strong Parameters, вам просто нужно преобразовать параметры в обычный хеш, как:
Конечно, это побеждает назначение сильных параметров, но если вы находитесь в ситуации, подобной моей (я делаю свое собственное управление разрешенными параметрами в другой части моей системы), это сделает работу.
источник
unable to convert unpermitted parameters to hash
Если вы используете ActiveAdmin, не забудьте, что в блоке регистрации модели также есть allow_params:
Они должны быть установлены вместе с таковыми в контроллере:
В противном случае вы получите ошибку:
источник
Для тех, кто использует CanCanCan :
Вы получите эту ошибку, если CanCanCan не сможет найти правильный метод params .
Для этого
:create
действия CanCan попытается инициализировать новый экземпляр с продезинфицированным вводом, посмотрев, будет ли ваш контроллер реагировать на следующие методы (по порядку):create_params
<model_name>_params
например article_params (это соглашение по умолчанию в rails для именования вашего метода param)resource_params
(метод с общим именем, который вы можете указать в каждом контроллере)Кроме того,
load_and_authorize_resource
теперь можно использоватьparam_method
опцию, чтобы указать пользовательский метод в контроллере для запуска для очистки ввода.Вы можете связать
param_method
опцию с символом, соответствующим имени метода, который будет вызван:источник: https://github.com/CanCanCommunity/cancancan#33-strong-parameters
источник
В качестве альтернативы вы можете использовать драгоценный камень Protected Attributes , однако это побеждает цель требовать сильных параметров. Однако если вы обновляете старое приложение, Protected Attributes обеспечивает легкий путь для обновления до тех пор, пока вы не сможете рефакторировать attr_accessible для сильных параметров.
источник
Если вы находитесь на Rails 4 и получаете эту ошибку, это может произойти, если вы используете
enum
модель, если вы определили с символами, подобными этим:Форма передаст, скажем, радио-селектор как строковый параметр. Вот что случилось в моем случае. Простое решение состоит в том, чтобы заменить
enum
строки вместо символовисточник