Has_Many через ассоциации и вложенные атрибуты

Я пытаюсь создать представление, позволяющее мне напрямую создавать и редактировать значения моей таблицы соединений. Эта модель называется «наем». Мне нужно иметь возможность создавать несколько строк в моей соединительной таблице, когда ребенок нанимает до 2 книг. У меня проблемы, и я подозреваю, что это из-за моих ассоциаций...

У меня 3 модели. У каждого ребенка может быть 2 книги:

class Child < ActiveRecord::Base
 has_many :hires
 has_many :books, through: :hires
end

class Hire < ActiveRecord::Base
 belongs_to :book
 belongs_to :child
 accepts_nested_attributes_for :book
 accepts_nested_attributes_for :child
end

class Book < ActiveRecord::Base
  has_many :hires
  has_many :children, through: :hires
  belongs_to :genres
end

Контроллер выглядит так:

class HiresController < ApplicationController

...    

def new
    @hire = Hire.new
    2.times do
      @hire.build_book
    end
  end

 def create
    @hire = Hire.new(hire_params)

    respond_to do |format|
      if @hire.save
        format.html { redirect_to @hire, notice: 'Hire was successfully created.' }
        format.json { render :show, status: :created, location: @hire }
      else
        format.html { render :new }
        format.json { render json: @hire.errors, status: :unprocessable_entity }
      end
    end
  end

 ...    

private
    # Use callbacks to share common setup or constraints between actions.
    def set_hire
      @hire = Hire.find(params[:id])
    end

    # Never trust parameters from the scary internet, only allow the white list through.
        def hire_params
  params.require(:hire).permit(:child_id, book_attributes: [ :id, :book_id, :_destroy])
end
end

Вид нравится это:

<%= form_for(@hire) do |f| %>

    <%= f.label :child_id %><br>
    <%= f.select(:child_id, Child.all.collect {|a| [a.nickname, a.id]}) -%>

    <%= f.fields_for :books do |books_form| %>


    <%= books_form.label :book_id %><br>
    <%= books_form.select(:book_id, Book.all.collect {|a| [a.Title, a.id]}) %>
        <%# books_form.text_field :book_id #%>
    <% end %>


  <div class="actions">
    <%= f.submit %>
  </div>
<% end %>

Проблема в том, что хэш не отправляет books_attributes, как вы ожидаете, он просто отправляет «книги»:

Processing by HiresController#create as HTML
  Parameters: {"utf8"=>"✓", "authenticity_token"=>"xx", "hire"=>{"child_id"=>"1", "books"=>{"book_id"=>"1"}}, "commit"=>"Create Hire"}
Unpermitted parameter: books

Я подозреваю, что это потому, что мои ассоциации с моделью Hire таковы:

belongs_to :book
accepts_nested_attributes_for :book

что означает, что я не могу правильно построить атрибуты, но я не уверен, как это решить. Любая помощь была бы отличной, я плохо решаю эту проблему?


person James Osborn    schedule 07.11.2015    source источник


Ответы (1)


Попробуйте изменить books_attributes на book_attributes в сильных параметрах для найма_парам.

    def hire_params
  params.require(:hire).permit(:child_id, book_attributes: [ :id, :book_id, :_destroy])
end
person Padhu    schedule 07.11.2015
comment
Та же проблема... Я думаю, что это связано с неправильным анализом атрибутов. Если передаются только «книги», значит, что-то там не так? - person James Osborn; 07.11.2015