Ruby on rails 精彩的ActiveModel::禁止属性错误

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

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

  • 如何找出导致问题的属性?
  • 我在下面的代码中遗漏了什么?
  • 让我们从错误开始,日志什么也没告诉我

    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。上述错误源于试图分配不正确的参数类型,即散列与单个变量。您也可以通过这样做获得: