无法 save/update 将记录存入 rails 中的数据库

Unable to save/update the record into db in rails

我正在尝试更新 rails 中 IsValid 和 Comments 列的记录,但未在后端更新或出现任何错误:

下面是我的参数结果:

Started PATCH "/metrics/1" for 
Processing by MetricsController#update as HTML
  Parameters: {"utf8"=>"✓", "authenticity_token"=>"1oC/1UdAaTPUepy1zIjO1x6n67Th/pdcnvYJH95cB63tZts9d135JIK4MzQD2/pdPoRKnUKXIc0ZI9MQZkjfNQ==", 
  "metrics_controller"=>{"IsValid"=>"False", "Comments"=>"1"}, "commit"=>"Save", "id"=>"1"}
  Metric Load (75.1ms)  SELECT  `Threshold`.* FROM `Threshold` WHERE `Threshold`.`ID` = 1 LIMIT 1
Unpermitted parameters: utf8, _method, authenticity_token, metrics_controller, commit, id
   (75.7ms)  BEGIN
   (75.1ms)  COMMIT

控制器中的更新方法:

 def update
        @metric = Metric.find(params[:id])
        #if(@metric.update(post_params))
        if(@metric.update_attributes(post_params))
          redirect_to metrics_path
        else
          render 'edit'
        end
      end
       private def post_params
    params.permit(:Metric, :WI, :Value, :UT, :Score, :IsValid, :UserName, :Comments)
  end

如果我用下面的代码更新 post_params 方法,它会抛出错误:

private def post_params
    params.require(:metric).permit(:Metric, :WI, :Value, :UT, :Score, :IsValid, :UserName, :Comments)
  end

根据 ruby 和 rails 中的约定,您应该几乎总是使用 snake_case 作为方法和变量;不是 CamelCase.

你没有提供足够的信息让我 100% 肯定地说这个(特别是 metrics table 的数据库模式是什么?),但这差不多肯定是这里的问题原因。

您的 Metric class 可能具有 valuescoreis_valid 等属性。但您正在尝试更新名为 CommentsIsValid。这些属性不存在,因此不会更新任何内容。


更改您的视图以使用 snake_case,并允许 snake_case 中的变量;那么它应该工作。 可能 像您在此处所做的那样使用 CamelCase 使其工作,但这违反惯例 - 因此需要更多努力。

正如@Tom Lord 提到的,您的参数大小写看起来很可疑,可能是您遇到问题的原因。如果您可以提供 metrics table 的架构,这将有助于我们帮助您。

当您遵循命名约定时,

Rails 将始终以最佳状态工作。这最重要的包括使用正确的大小写和 singular/plural 名称。

如果您的代码以 Rails 方式编写,我希望您的代码看起来像这样:

def update
  @metric = Metric.find(params[:id])
  if @metric.update(post_params)
    redirect_to metrics_path
  else
    render 'edit'
  end
end

private 

def post_params
  params.permit(:metric, :wi, :value, :ut, :score, :is_valid, :user_name, :comments)
end

来自请求(来自日志)的参数是:

{
  "utf8"=>"✓",
  "authenticity_token"=>"1oC/1UdAaTPUepy1zIjO1x6n67Th..",
  "metrics_controller"=> {
    "IsValid"=>"False",
    "Comments"=>"1"
  },
  "commit"=>"Save",
  "id"=>"1"
}

所以键isValid在键metrics_controller下面。 然后,有了这种即将到来的数据,在你的控制器中,你应该调用

params
  .require(:metrics_controller)
  .permit(:IsValid, :Comments, :id)

您应该注意命名约定(snake_case 而不是 CamelCase),但最重要的是负责此请求的表单应该根据您的控制器所期望的来命名输入。

然后,你应该用类似的东西命名表单元素(根据你的截图)

<select name="metric[is_valid]">
  <option value="1">Yes</option>
  <option value="0">No</option>
</select>

使用这种命名方式,数据将在键 metric 而不是 metric_controller 中限定范围,并且它将通过强参数。