Rails - недопустимые вложенные дочерние параметры

Родитель сохранен, а дети нет. Если я добавлю landslide.sources.createсоздает строку в sources таблица с правильным landslide_id но все остальные столбцы пусты. Вот файлы:

landslide_controller.rb

  def new
    @landslide = Landslide.new
    @landslide.sources.build
  end

  def create
    landslide = Landslide.new(landslide_params)
    landslide.save
  end

  def landslide_params
      params.require(:landslide).permit(:start_date, :continent, :country, :location, :landslide_type, :lat, :lng, :mapped, :trigger, :spatial_area, :fatalities, :injuries, :notes, source_attributes: [ :url, :text ])
  end

sources_controller.rb

  def new
    source = Source.new
  end

  def create
    source = Source.new(source_params)

    source.save
  end

  def source_params
    params.require(:source).permit(:url, :text)
  end

_form.html.haml

= form_for :landslide, :url => {:controller => 'landslides', :action => 'create'} do |f|

  .form-inputs
    %form#landslideForm
      #Fields
   %fieldset
        %legend Source
        = f.fields_for :sources do |s|
          .form-group.row
            = s.label :url, class: 'col-sm-2 col-form-label'
            .col-sm-10
              = s.text_field :url, class: "form-control"
          .form-group.row
            = s.label :text, class: 'col-sm-2 col-form-label'
            .col-sm-10
              = s.text_field :text, class: "form-control"


      .form-actions
        = f.button :submit, class: "btn btn-lg btn-primary col-sm-offset-5", id: "submitButton"

landslide.rb и source.rb

class Source < ApplicationRecord
  belongs_to :landslide, inverse_of: :sources
end

class Landslide < ApplicationRecord
  has_many :sources, dependent: :destroy, inverse_of: :landslide
  accepts_nested_attributes_for :sources

** rout.rb **

  resources :landslides do
    resources :sources
  end

1 ответ

Решение

Согласно вашему коду ожидается создание source с нулевым полем. Потому что landslide.sources.create здесь вы создаете source без каких-либо значений атрибутов.

Чтобы успешно сохранить source выполните следующий шаг.

  1. строить source на новом методе контроллера def new @landslide = Landslide.new @landslide.sources.build end
  2. пользователь @landslide (объявлено на new) в форме = form_for @landslide а другая вещь останется такой же.

  3. Удалить landslide.sources.create от твоего landslide_controller.rb так как source сохранит автоматически после сохранения landslide,

Надеюсь, что вышеупомянутые изменения решат вашу проблему.

Другие вопросы по тегам