在我的控制器中,我想使用更新方法将字段更新为模型对象。我模型的某些字段是整数类型。但是,这些字段是params对象中的字符串。
我想做
def profile_params
params
.require(:client)
.permit(:marital_status, :name, ...)
end
def update
@client = Client.find params[:id]
@client = Client.update(profile_params)
end
但是出现以下错误
ArgumentError-'0'不是有效的婚姻状况。
当然,如果在profile_params.rb
内将marital_status
转换为整数,该特定错误就消失了,但是Client
类中有很多整数字段。我在想有比手动转换每个字段更好的解决方案。或者即使我必须,组织代码的最佳方法是什么?
编辑:这是客户端模型的摘要
class Client < ApplicationRecord
enum marital_status: %i[single married divorced separated widowed]
end
和传递给控制器的参数看起来像这样:
Parameters: {"utf8"=>"✓", "authenticity_token"=>"tLUZ0bb6tRRkx/OFNVbhCT/AnrudPbCQMvOakw9HyiHkiqMip5tkDnYsF2F/e7TE4VkmIgF1hxtYI78Pw2bsSw==", "client"=>{"id"=>"517", "marital_status"=>"0"}, "id"=>"517"}
我认为从.to_i
读取值时除了使用profile_params
别无其他方法。
枚举很棘手,因为您可以通过键或按值使用它们。
假设您的枚举:
Client.marital_statuses
# => {"single"=>0, "married"=>1, "divorced"=>2, "separated"=>3, "widowed"=>4}
使用值(索引)的分配:
c1 = Client.new
c1.marital_status = 0
c1.marital_status
# => "single"
c1.marital_status_before_type_cast
# => 0
使用键(名称)进行分配:
c2 = Client.new
c2.marital_status = 'married'
c2.marital_status
# => "married"
c2.marital_status_before_type_cast
# => "married"
我认为这是Rails不将String强制转换为Integer的原因,因为它不知道应该使用值(索引)而不是键(名称)。
c3 = Client.new
c3.marital_status = '0'
# Traceback (most recent call last):
# 2: from (irb):6
# 1: from (irb):7:in `rescue in irb_binding'
# ArgumentError ('0' is not a valid marital_status)