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