用字符串强参数更新Rails模型的整数字段

问题描述 投票:0回答:1

在我的控制器中,我想使用更新方法将字段更新为模型对象。我模型的某些字段是整数类型。但是,这些字段是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"}
ruby-on-rails controller strong-parameters
1个回答
0
投票

我认为从.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)
© www.soinside.com 2019 - 2024. All rights reserved.