在不允许ID

时间:2015-12-01 14:40:52

标签: ruby-on-rails ruby rspec strong-parameters

我有一个RESTful更新模型的控制器。该行动如下:

def update
  @user = User.find(params[:id])
  params['skill_list'] = params['skill_list'].join(',') if params['skill_list'].present?
  @user.update!(user_params)
  render nothing: true
end

def user_params
  params.permit(:id, :summary, :skill_list)
end

我的规格如下:

it "should return 200 if param is for user put is summary" do
  ActionController::Parameters.action_on_unpermitted_parameters = :raise
  put :update, id: @bob.id, summary: 'yadayada', skill_list: ['a','b']
  assert_response 200
end

现在流程如下

  1. 我们需要将id放在put规范中,以告知更新时id使用哪个。{/ li>
  2. Controller找到它并更新summaryskill_list字段。
  3. 但是,它也覆盖id
  4. 如果我不允许id,则测试会因ActionController::UnpermittedParams
  5. 而失败
  6. 如果我允许,实际的id会被替换(我们使用friendly_id gem以便不需要 - 数字ID将被slug替换,导致用户无法使用。
  7. 目前我们禁止id并将规范置于待定状态 - 但这些情况下的最佳做法是什么?

    提前致谢!

1 个答案:

答案 0 :(得分:1)

  

患者:我更新ID栏时会感到疼痛!

     

医生:然后停止这样做。

从允许的参数列表中删除“id”。它不属于那里。

使用以下内容更新模型

@user.update!(user_params)

更新ID列,因为user_params包含id密钥。停止这样做:

@user.update!(user_params.except("id"))