创build新用户时的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+\-.]+@[az\d\-.]+\.[az]+\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]

你能告诉我如何摆脱这个错误或build立一个适当的用户registry吗?

我猜你正在使用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 。 如果使用CanCanRails 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 

更新:

CanCan的一个名为CanCanCan的延续项目看上去很有希望:

CanCanCan

有一个更简单的方法来避免强参数,你只需要将参数转换为一个常规的散列,如下所示:

 unlocked_params = ActiveSupport::HashWithIndifferentAccess.new(params) model.create!(unlocked_params) 

这当然违背了强参数的目的,但是如果你处于像我这样的情况下(我正在自己的系统的另一部分pipe理允许的参数),这将完成工作。

如果使用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无法find正确的参数方法,将会出现此错误。

对于:create操作,CanCan将尝试通过查看控制器是否响应以下方法(按顺序)来初始化带有清理input的新实例:

  1. create_params
  2. <model_name>_params ,如article_params(这是用于命名您的param方法的rails中的默认约定)
  3. resource_params (一个可以在每个控制器中指定的通用命名方法)

此外, load_and_authorize_resource现在可以使用param_method选项来指定控制器中的自定义方法来运行以清理input。

您可以将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重构为强参数为止。

你好我的情况错误是固定的,但得到空的结果是数据库。

  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