Ruby on rails 精彩的ActiveModel::禁止属性错误
我一直在使用strong_参数,并试图让对象创建通过。我有两个问题Ruby on rails 精彩的ActiveModel::禁止属性错误,ruby-on-rails,Ruby On Rails,我一直在使用strong_参数,并试图让对象创建通过。我有两个问题 如何找出导致问题的属性? 我在下面的代码中遗漏了什么? 让我们从错误开始,日志什么也没告诉我 ActiveModel::ForbiddenAttributesError in JobsController#create 这是我看不太有用的日志,仅供参考: Started POST "/jobs" for 127.0.0.1 at 2013-12-17 22:03:59 +0000 Processing by JobsContr
ActiveModel::ForbiddenAttributesError in JobsController#create
这是我看不太有用的日志,仅供参考:
Started POST "/jobs" for 127.0.0.1 at 2013-12-17 22:03:59 +0000
Processing by JobsController#create as HTML
Parameters: {"utf8"=>"✓", "authenticity_token"=>"Ohq4lVqPVMpjzbZwCfJNYBL78TAcoC0WZLSmpCzMD3k=", "job"=>{"job_title"=>"Junior Rails Developer", "job_description"=>"A new position getig nsomethfins lansnana", "languages"=>["", "Rails", "Ruby"], "country_code"=>"AO", "job_type"=>"Full-Time", "job_salary"=>"30000", "job_level"=>"Junior"}, "commit"=>"Create Job"}
User Load (0.5ms) SELECT "users".* FROM "users" WHERE "users"."id" = 1 ORDER BY "users"."id" ASC LIMIT 1
Completed 500 Internal Server Error in 8ms
ActiveModel::ForbiddenAttributesError (ActiveModel::ForbiddenAttributesError):
有道理,但如果我看一下我的创作:
def create
binding.pry
@job = Job.new(job_params)
respond_to do |format|
if @job.save
format.html { redirect_to @job, notice: 'Job was successfully created.' }
format.json { render action: 'show', status: :created, location: @job }
else
format.html { render action: 'new' }
format.json { render json: @job.errors, status: :unprocessable_entity }
end
end
end
强参数:
def job_params
params.require(:job).permit(:job_title, :job_level, :job_description, :job_salary,
:country_code, :job_type, :state, :languages => [])
end
我主要感兴趣的是如何找出未来的问题所在,因为这似乎是大海捞针的错误。在您的日志文件中,它显示了应用程序从创建中获得的参数:
Parameters: {"utf8"=>"✓", "authenticity_token"=>"Ohq4lVqPVMpjzbZwCfJNYBL78TAcoC0WZLSmpCzMD3k=", "job"=>{"job_title"=>"Junior Rails Developer", "job_description"=>"A new position getig nsomethfins lansnana", "languages"=>["", "Rails", "Ruby"], "country_code"=>"AO", "job_type"=>"Full-Time", "job_salary"=>"30000", "job_level"=>"Junior"}, "commit"=>"Create Job"}
您需要首先确保每个参数都列在强参数定义中。然后确保每个参数都是正确的类型
:parameter #accepts a single entry
:parameter => [] #accepts a hash
:paramters_attributes: [:firstattribute, :secondattribute] #accepts nested parameters
您的languages参数在日志中显示为哈希,但在允许的参数中只有:languages。将参数更改为接受哈希应该可以解决这个问题
:languages => []
这篇博文还通过示例展示了一些强大的参数,对您很有帮助:
当您尝试批量分配包含未授权密钥的参数哈希时,会引发此错误。您的
job_params
方法返回一个仅包含permit
调用中指定的键/值的散列,因此一切都应该正常
您确定错误发生在发布的代码段中吗?唯一可能的位置是行
@job=job.new(job_params)
,回溯中是否提到该行?如果没有,你能发布完整的回溯吗?因为错误必须发生在过滤器、观察者或类似的东西中…这可能不适用于这种情况,但我在Rails 4中遇到过这种类型的问题,但只适用于创建操作。
通过查看开发日志中的完整堆栈跟踪显示了对CanCan和我用于访问控制的能力模型的一些参考
我开始使用
加载和授权资源
正如控制器顶部所建议的,但当我将其删除并仅允许每个“长时间”操作时,参数问题消失了。您重新启动了本地服务器吗?哈,只是检查一下。查看您的语言会在日志中显示为哈希。尝试将:languages切换为languages:[]或:languages=>[]以保持代码的语法相同您是否在模型中为所有允许的属性定义了attr\u accessible?现在它工作时应该会有所不同吗?我已经发布了一个答案,展示了如何处理各种强参数数据。你能分享你的工作模型代码吗?服务器重新启动时尝试使用允许的标量值,但仍然得到相同的错误,这是我在Rails中经常遇到的唯一一个没有给你惊人反馈的错误。你知道我还能怎么找到这个错误吗?是的,我正在使用rails,我猜你提供的代码中没有这个错误。你也可以在网上查询信息。作为最后的手段,您可以使用
params.require(:job.permit)代码>但这将大量分配所有当前和未来的属性。ChrisBarthol-我遇到了同样的问题。假设问题是他把job_title错打成了“joo_title”。如何从禁止属性错误中提取该错误消息?您不会得到相同的错误。如果您这样做了,并且您正试图为job_title分配一个值,您将在日志文件中得到一个错误,该错误为:unpermittedparameters:job_title。上述错误源于试图分配不正确的参数类型,即散列与单个变量。您也可以通过这样做获得: