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+\-.][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
когда я запускаю это действие
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]
.
Не могли бы вы рассказать мне, как избавиться от этой ошибки или создать надлежащую регистрационную форму пользователя?
Ответы
Ответ 1
Я предполагаю, что вы используете 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
Ответ 2
Для тех, кто использует CanCan. Люди могут испытывать это, если они используют CanCan с Rails 4 +. Попробуйте AntonTrapps довольно чистое решение обходного решения здесь, пока CanCan не будет обновлен:
В 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
Update:
Здесь проект продолжения для CanCan называется CanCanCan, который выглядит многообещающим:
CanCanCan
Ответ 3
Существует более простой способ избежать сильных параметров вообще, вам просто нужно преобразовать параметры в обычный хеш, например:
unlocked_params = ActiveSupport::HashWithIndifferentAccess.new(params)
model.create!(unlocked_params)
Это, конечно, побеждает цель сильных параметров, но если вы находитесь в такой ситуации, как моя (я выполняю собственное управление разрешенными параметрами в другой части моей системы), это выполнит эту работу.
Ответ 4
Если вы используете ActiveAdmin, не забывайте, что в блоке регистров модели есть также allow_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
Ответ 5
Для тех, кто использует CanCanCan:
Вы получите эту ошибку, если CanCanCan не сможет найти правильный метод params.
Для действия :create
CanCan попытается инициализировать новый экземпляр с помощью дезинфицированного ввода, увидев, будет ли ваш контроллер отвечать на следующие методы (по порядку):
-
create_params
-
<model_name>_params
, например article_params (это
соглашение по умолчанию в rails для именования вашего метода param)
-
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#strong-parameters
Ответ 6
В качестве альтернативы вы можете использовать Защищенный атрибут gem, однако это наносит ущерб требованию сильных параметров. Однако, если вы обновляете более старое приложение, защищенные атрибуты предоставляют простой путь для обновления до тех пор, пока вы не сможете реорганизовать attr_accessible на сильные параметры.
Ответ 7
Нашел это во время работы с этим уроком.
https://guides.rubyonrails.org/getting_started.html#installing-rails
Попытка создать новую статью, отправив форму
my_domain/статьи/новые
маршруты к
my_domain/статьи
ActiveModel :: ForbiddenAttributesError в ArticlesController # create
ActiveModel :: ForbiddenAttributesError
articles_controller.rb
Извлеченный источник (около строки № 10): Def Create @article = Article.new(params [: article])
оценить это не правильно сформулированный вопрос. Надеемся найти более простое учебное пособие, чем этот.
Мой мерзавецhttps://github.com/aspiringguru/RubyRailsDemo1/tree/3b889f833069ff924d92c011224a289cc13558d7
Ответ 8
привет в моем случае ошибка исправлена, но получение пустого результата - это база данных.
def create
@worklog = Worklog.new(user_params)
@worklog.day = Date.today
@worklog.week = Date.today.strftime("%W").to_i
@worklog.author = User.current
@worklog.save
redirect_to worklogs_path()
end
def user_params
params.require(:worklog).permit(:utf8, :authenticity_token, {:worklog => [:typee, :do, :todo, :feel, :plan_done, :plan, :week_feel, :score, :good, :nogood]}, :commit)
}
Мой оригинальный плагин
https://github.com/IceskYsl/worklogs