精彩的ActiveModel :: ForbiddenAttributesError

时间:2013-12-17 22:13:55

标签: ruby-on-rails

我一直在使用strong_params并尝试让对象创建传递。我有两个问题。

  1. 如何找出导致问题的属性?
  2. 我在下面的代码中缺少什么?
  3. 让我们从错误开始,日志告诉我什么。

    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
    

    我主要想找到如何找出未来问题的位置,因为它似乎是大海捞针错误的一针。

3 个答案:

答案 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),这个行是在回溯中提到的吗?如果没有,你能发布完整的回溯吗?因为错误必须发生在过滤器或观察者或类似的东西......