В Rails, как я могу принудительно преобразовать строку в объект при отправке моей формы?

Я использую Rails 4.2.4. У меня есть таблица «my_objects» со столбцом «address_id», который является внешним ключом к моей таблице «адреса». Поэтому в моей модели my_object.rb мне пришлось создать метод для одновременного сохранения объекта и адреса.

  belongs_to :address, :autosave => true, dependent: :destroy
  def save_with_address
    transaction do
      if !self.address.nil?
        address = Address.new(self.address)
        address.my_object = self
        address.save
        self.address = address
      end

      # Save the object
      save
    end
  end

Для справки, мой адресный объект (у которого в базе данных есть столбец state_id и столбец country_id) структурирован следующим образом…

class Address < ActiveRecord::Base
  belongs_to :state
  belongs_to :country
  has_one :my_object
end

Однако, когда я отправляю свою форму с приведенными ниже данными

  Parameters: {"utf8"=>"✓", "my_object"=>{"id"=>"", "name"=>"Dave20", "day"=>"07/06/2016", "distance"=>"10", "distance_unit_id"=>"5", "hour"=>"00", "minute"=>"04", "second"=>"05", "address"=>{"city"=>"baltimore", "state"=>"3555"}, "my_object_times_attributes"=>{"0"=>{"overall_rank"=>"", "age_group_rank"=>"", "gender_rank"=>"", "time_in_ms"=>"245000"}}}, "commit"=>"Save"}   

эта строка «address = Address.new(self.address)» не работает с ошибкой «ActiveRecord::AssociationTypeMismatch (состояние (# 70161141072220) ожидалось, получено String (# 70161059455060)):». Очевидно, что Rails не преобразует мою строку идентификатора состояния в объект. Как я могу это сделать?


person Dave    schedule 20.07.2016    source источник


Ответы (2)


Ваша модель Address зависит от двух других моделей State и country, поэтому, когда вы пытались создать новый объект для Address, передав self.address, возникла ошибка.

Чтобы решить эту проблему, вы должны внести изменения в свой код, создав новый объект для state и country по переданному значению и передать этот объект Address.new, прямо сейчас state и country проходят как string, поэтому, очевидно, это не сработает.

Надеюсь, это поможет.

person hgsongra    schedule 27.07.2016
comment
Можно ли как-нибудь изменить имена параметров, чтобы преобразование происходило автоматически? Если это невозможно, то не могли бы вы привести примеры относительно вашего комментария, внести изменения в свой код, создав новый объект? - person Dave; 27.07.2016
comment
Вы должны предоставить раскрывающиеся поля state и country в своей форме и передать значение как state_id и country_id для вашей модели address. - person hgsongra; 27.07.2016

Используйте метод accepts_nested_attributes_for. Более подробное объяснение см..

person Shishir    schedule 31.07.2016