无法将记录保存/更新到Rails中的db中

时间:2018-11-14 13:16:05

标签: ruby-on-rails ruby ruby-on-rails-3 ruby-on-rails-4

我正在尝试更新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

enter image description here

控制器中的更新方法:

 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

3 个答案:

答案 0 :(得分:1)

按照红宝石和Rails的约定,对于方法和变量,几乎应该始终使用snake_case;不是CamelCase

您还没有提供足够的信息让我可以100%地确定这一点(特别是metrics表的数据库模式是什么?),但这几乎肯定是造成问题的原因在这里。

您的Metric类可能具有诸如valuescoreis_valid等属性。但是您正在尝试更新名为Comments和{ {1}}。这些属性不存在,因此没有任何更新。


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

答案 1 :(得分:1)

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

{
  "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中确定作用域,并且将通过强大的参数。

答案 2 :(得分:0)

正如@Tom Lord所提到的,参数的大小写看起来可疑,可能会导致您的问题。如果您可以为metrics表提供架构,这将有助于我们为您提供帮助。

当您遵循命名约定时,滑轨将始终保持最佳状态。最重要的是,这包括使用正确的大小写和单/复数名称。

这是我期望您的代码以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