Обновление целочисленного поля модели Rails со строковыми строгими параметрами - PullRequest
0 голосов
/ 26 мая 2020

В моем контроллере я хочу обновить поля объекта модели в моем методе обновления. Некоторые поля моей модели относятся к целочисленному типу. Однако эти поля являются строками в объекте 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 'не является допустимым marital_status.

Разумеется, если внутри моего 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"}

1 Ответ

0 голосов
/ 27 мая 2020

Я предполагаю, что нет другого способа, кроме использования .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, потому что он не знает, что он должен использовать значение (index) вместо ключа (name).

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)
...