Проблема в форме и стилях из-за нескольких типов. Ruby on Rails

Передаёться обьект как другая модель, поэтому не работает корректно возвращение к форме, после неудачно заданых значений. Когда указаны неверные аргументы в полях или просто неуказаны, меня вертает на форму для правки результата, но тогда обьект уже не с теми id, для которых всё писалось. поля перед отправкой

поля после отправки

Контроллер:

    def new
    @place = Place.new
    @address = Address.new
    @picture = Picture.new
  end

  def create
    @place = current_user.places.build(place_params.except(:address, :picture))
    @address = @place.build_address(place_params.require(:address))
    @picture = @place.pictures.build(place_params.require(:picture))
    if @place.save
      @address.save
      @picture.save
      flash[:info] = 'Place created'
      redirect_to places_path
    else
      render :new
    end
  end

params.require(:place).permit(:title,
                              :description,
                              :price,
                              :type,
                              address: [:country,
                                        :state_region,
                                        :city,
                                        :details],
                              picture: [:image_cache, { image: [] }])

Вьюшки:

  = form_for(@place, url: places_path) do |f|
      .row.justify-content-center.form-row
        .col-xl-4
          .blur
            .col-lg-12
              .mb-2.row
                .col-md-12
                  p = f.label 'Title'
                  = f.text_field :title, placeholder: 'My first place', alt: 'Title'
              .mb-2.row
                .col-md-12
                  p = f.label 'Type'
                  = f.select :type, ['Accommodation', 'Workspace'], alt: 'Type'
              .mb-2.row
                .col-md-12
                  p = f.label 'Description'
                  = f.text_area :description, placeholder: 'Something about your place..', alt: 'Description', size: '80'
              .mb-2.row
                .col-md-12
                  p = f.label 'Price'
                  = f.text_field :price, alt: 'Price'
                  a.dollar $
        .col-xl-5
          .blur
            .col-lg-12
              = f.fields_for @address do |a|
                .mb-2.row
                  .col-md-12
                    p = a.label 'Address'
                    = a.text_field :details, placeholder: 'Like street, number of house..', alt: 'Address'
                .mb-2.row
                  .col-md-12
                    p = a.label 'City'
                    = a.text_field :city, placeholder: 'City..', alt: 'city'
                .mb-2.row
                  .col-md-12
                    p = a.label 'State / Region'
                    = a.text_field :state_region, placeholder: 'Your state or region..', alt: 'State or region'
                .mb-2.row
                  .col-md-12
                    p = a.label 'Country'
                    = a.country_select :country, priority_countries: ['UA', 'RU', 'BY', 'GB']
                .mb-2.row
                  .col-md-12
                    p Or select on map:
                    #map
        .col-xl-3
          .blur
            .col-lg-12
              = f.fields_for @picture do |i|
                .row
                  #image-column.col-md-12
                .row.mb-2
                  #fileInputColumn.col-md-12
                    = i.label '+', for: 'place_picture_image', id: 'place_picture_label'
                    = i.file_field :image, hidden: '', multiple: true
                    = i.hidden_field :image_cache

        .row.button-row
          .col-xl-4
            .col-md-12.button-col
              = f.submit 'Save', class: 'button'

В моделе:

    scope :workspaces, -> { where(type: 'Workspace') }
    scope :accommodations, -> { where(type: 'Accommodation') }
    accepts_nested_attributes_for :address
    accepts_nested_attributes_for :pictures

Ответы (1 шт):

Автор решения: Василиса

Вы же используете accepts_nested_attributes_for, форма построена с этим учётом, почему тогда в контроллере вы пытаетесь сущности по отдельности сохранить?

def new
  @place = Place.new
  @address = @place.build_address
end

def create
  @place = current_user.places.build(place_params.except)
  if @place.save
    flash[:info] = 'Place created'
    redirect_to places_path
  else
    render :new
  end
end

= form_for(@place) do |f|
...
  = f.fields_for @address do |a|      
  = f.fields_for :pictures do |i|
→ Ссылка