嵌套资源方法中“param缺失或值为空”

时间:2017-11-20 11:38:47

标签: ruby-on-rails activerecord ruby-on-rails-5 strong-parameters

我正在尝试创建一种叫做' pack'在一个叫做工作的资源下。

我的路线看起来像这样:

  resources :jobs do
    member do
      get 'pack' => 'jobs#pack'
    end
  end

我的控制器方法的简化版本看起来像这样。

def pack
    @job.pack
  end

为了获得包装,我有:

  before_action :set_job, only: %i[show edit update destroy pack]

  # Use callbacks to share common setup or constraints between actions.
  def set_job
    @job = Job.find(params[:id])
  end

  # Never trust parameters from the scary internet, only allow the white list through.
  def job_params
    params.require(:job).permit(:description, :status, :client_id, :pack_size, :user_id)
  end

我能够点击我的/ end / point / jobs / 1 / pack并触发控制器方法,但我遇到了错误:

  

param丢失或值为空:job

show和pack方法都接收保存参数:

Parameters: {"id"=>"1"}

所以我不确定为什么只有#pack方法会让我失去工作错误。为什么会发生这种情况?如何阻止它呢?

控制台输出:

Started GET "/api/v1/jobs/1/pack?user_id=1" for 127.0.0.1 at 2017-11-20 19:57:24 +0800
Processing by JobsController#pack as HTML
  Parameters: {"user_id"=>"1", "id"=>"1"}
  Job Load (0.2ms)  SELECT  "jobs".* FROM "jobs" WHERE "jobs"."id" = $1 LIMIT $2  [["id", 1], ["LIMIT", 1]]
Completed 400 Bad Request in 2ms (ActiveRecord: 0.2ms)



ActionController::ParameterMissing - param is missing or the value is empty: job:
  app/controllers/jobs_controller.rb:87:in `job_params'
  app/controllers/jobs_controller.rb:6:in `pack'

1 个答案:

答案 0 :(得分:1)

问题出在job_params身体的第一部分。

您需要:jobparams.require(:job),但参数中没有:job

Parameters: {"user_id"=>"1", "id"=>"1"}

因此,您可以删除require部分,只需在job_params中调用以下内容:

params.permit(:description, :status, :client_id, :pack_size, :user_id, :id)

注意:我在白名单中添加了:id,因为我可以看到它们也存在于参数中。