【问题标题】:The wonderful ActiveModel::ForbiddenAttributesError精彩的 ActiveModel::ForbiddenAttributesError
【发布时间】:2013-12-17 22:13:55
【问题描述】:

我一直在使用 strong_params 并试图让对象创建通过。我有两个问题。

  1. 如何找出导致问题的属性?
  2. 我在下面的代码中遗漏了什么?

让我们从错误开始,日志什么也没告诉我。

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

我主要想知道如何找出问题出在哪里,因为这似乎是大海捞针的错误。

【问题讨论】:

  • 你重启本地服务器了吗?
  • 哈,只是检查一下。查看您的语言在日志中显示为哈希。尝试将 :languages 切换为 language: [] 或 :languages => [] 以与您的代码保持相同的语法
  • 您是否在模型中为您允许的所有属性定义了 attr_accessible?
  • 现在应该有所作为吗?我已经发布了一个答案,展示了如何处理一些不同的 strong_parameter 数据。
  • 您能分享一下您的工作型号代码吗?

标签: ruby-on-rails


【解决方案1】:

在您的日志文件中,它显示了应用从创建中获取的参数:

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 => []

此外,这篇博文还通过示例展示了一些强大的参数来提供帮助: http://blog.sensible.io/2013/08/17/strong-parameters-by-example.html

【讨论】:

  • 服务器重新启动尝试使用 Permitted Scalar Values 但仍然得到相同的错误,这是我在 Rails 中通常遇到的唯一错误,它没有给你惊人的反馈。知道我还能如何找到错误。
  • 是的,我正在使用 rails 4
  • 我的猜测是错误不在您提供的代码中。您也可以查看github.com/rails/strong_parameters 获取信息。作为最后的手段,您可以使用params.require(:job).permit!,但这将大量分配所有当前和未来的属性。
  • ChrisBarthol - 我遇到了同样的问题。假设问题在于他将 job_title 错误地输入为“joo_title”。如何从 ForbiddenAttributesError 中提取该错误消息?
  • 你不会得到同样的错误。如果你这样做了,并且你试图为 job_title 分配一个值,你会在你的日志文件中得到一个错误,上面写着:Unpermitted parameters: job_title。上述错误来自尝试分配不正确的参数类型,即散列与单个变量。你也可以这样做:stackoverflow.com/questions/17868427/…
【解决方案2】:

它可能不适用于这种情况,但我遇到了 Rails 4 的问题类型,但仅限于 create 操作。 查看开发日志中的完整堆栈跟踪显示了对 CanCan 的一些引用以及我用于访问控制的能力模型。

我开始使用 load_and_authorize_resource 按照控制器顶部的建议,但是当我将其删除并仅允许“长手”每个动作时,参数问题就消失了。

【讨论】:

    【解决方案3】:

    当您尝试批量分配包含未经许可的键的参数哈希时会引发此错误。您的 job_params 方法返回一个仅包含在 permit 调用中指定的键/值的哈希,所以一切都应该没问题...

    您确定错误发生在发布的代码段中吗?唯一可能的位置是@job = Job.new(job_params) 行,回溯中是否提到了这一行?如果没有,您能否发布完整的回溯?因为错误必须发生在过滤器或观察者或类似的东西中......

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多