我一直在使用strong_params并尝试让对象创建传递。我有两个问题。
让我们从错误开始,日志告诉我什么。
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
Strong_params:
def job_params
params.require(:job).permit(:job_title, :job_level, :job_description, :job_salary,
:country_code, :job_type, :state, :languages => [])
end
我主要想找到如何找出未来问题的位置,因为它似乎是大海捞针错误的一针。
答案 0 :(得分:2)
在您的日志文件中,它显示了应用从create:
获取的参数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"}
您需要首先确保每个参数都列在强params定义中。然后确保每个参数都是正确的类型。
:parameter #accepts a single entry
:parameter => [] #accepts a hash
:paramters_attributes: [:firstattribute, :secondattribute] #accepts nested parameters
您的语言参数在日志中显示为哈希值,但您只有:允许参数中的语言。将参数更改为接受哈希值可以解决问题。
:languages => []
此博客文章通过示例显示一些强大的参数也很有帮助: http://blog.sensible.io/2013/08/17/strong-parameters-by-example.html
答案 1 :(得分:1)
它可能不适用于这种情况,但我遇到了Rails 4的问题类型,但仅限于创建操作。 查看开发日志中的完整堆栈跟踪,显示了CanCan的一些参考以及我用于访问控制的能力模型。
我开始使用了 load_and_authorize_resource 按照控制器顶部的建议,但当我删除它并且只允许每个动作“长手”时,参数的问题就消失了。
答案 2 :(得分:0)
当您尝试批量分配包含未授权键的参数哈希时,会引发此错误。您的job_params
方法返回的哈希只包含permit
调用中指定的键/值,所以一切都应该没问题......
您确定发布的代码段中发生了错误吗?唯一可能的位置是行@job = Job.new(job_params)
,这个行是在回溯中提到的吗?如果没有,你能发布完整的回溯吗?因为错误必须发生在过滤器或观察者或类似的东西......