我正在尝试更新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
答案 0 :(得分:1)
按照红宝石和Rails的约定,对于方法和变量,几乎应该始终使用snake_case
;不是CamelCase
。
您还没有提供足够的信息让我可以100%地确定这一点(特别是metrics
表的数据库模式是什么?),但这几乎肯定是造成问题的原因在这里。
您的Metric
类可能具有诸如value
,score
,is_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