无法 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 可能具有 value
、score
、is_valid
等属性。但您正在尝试更新名为 Comments
和 IsValid
。这些属性不存在,因此不会更新任何内容。
更改您的视图以使用 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
中限定范围,并且它将通过强参数。
我正在尝试更新 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 可能具有 value
、score
、is_valid
等属性。但您正在尝试更新名为 Comments
和 IsValid
。这些属性不存在,因此不会更新任何内容。
更改您的视图以使用 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
中限定范围,并且它将通过强参数。