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+\-.]+@[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

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

не могли бы вы рассказать мне, как избавиться от этой ошибки или установить правильную форму регистрации пользователя?

7 ответов


Я думаю, вы используете 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

для тех, кто использует CanCan. Люди могут испытывать это, если они используют Канкан С рельсы 4+. Попробуй!--10-->AntonTrapps довольно чистое обходное решение здесь пока Канкан не будет обновлен:

на 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

обновление:

вот продолжение проекта для Канкан позвал!--4-->CanCanCan, который выглядит многообещающим:

CanCanCan


существует более простой способ избежать сильных параметров вообще, вам просто нужно преобразовать параметры в обычный хэш, как:

unlocked_params = ActiveSupport::HashWithIndifferentAccess.new(params)

model.create!(unlocked_params)

это, конечно, побеждает цель сильных параметров, но если вы находитесь в ситуации, подобной моей (я делаю свое собственное управление разрешенными параметрами в другой части моей системы), это выполнит работу.


при использовании ActiveAdmin не забывайте, что в блоке регистра модели также есть permit_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

для тех, кто использует CanCanCan:

вы получите эту ошибку, если CanCanCan не может найти правильный метод params.

на :create действие, CanCan попытается инициализировать новый экземпляр с дезинфицированным входом, увидев, будет ли ваш контроллер реагировать на следующие методы (по порядку):

  1. create_params
  2. <model_name>_params такие как article_params (это соглашение по умолчанию в rails для именования вашего метода param)
  3. resource_params (метод с общим именем, который можно указать в каждый контроллер)

кроме того, load_and_authorize_resource теперь можно взять 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


в качестве альтернативы вы можете использовать защищенные атрибуты gem, однако это побеждает цель требования сильных параметров. Однако если вы обновляете старое приложение, защищенные атрибуты предоставляют простой путь для обновления до тех пор, пока вы не сможете рефакторировать attr_accessible для сильных параметров.


hello в моем случае ошибка исправлена, но получение пустого результата является базой данных.

 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