recursos rails formularios anidados ruby-on-rails ruby-on-rails-4 model associations nested-attributes

ruby on rails - rails - Has_Many a través de asociaciones y atributos anidados



rails formularios (1)

Intenta cambiar books_attributes por book_attributes en parámetros fuertes para hire_param.

def hire_params params.require(:hire).permit(:child_id, book_attributes: [ :id, :book_id, :_destroy]) end

Intento crear una vista que me permita crear y editar valores de mi tabla de unión directamente. Este modelo se llama ''alquileres''. Necesito poder crear varias filas en mi tabla de unión para cuando un niño contrata hasta 2 libros. Estoy teniendo problemas y sospecho que se debe a mis asociaciones ...

Tengo 3 modelos. Cada niño puede tener 2 libros:

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

El controlador se ve así:

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

A la vista le gusta esto:

<%= 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 %>

El problema es que el hash no está enviando books_attributes como era de esperar, solo está enviando ''books'':

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

Sospecho que esto se debe a que mis asociaciones para el modelo de alquiler son:

belongs_to :book accepts_nested_attributes_for :book

lo que significa que no puedo construir los atributos correctamente, pero no estoy seguro de cómo resolver esto. Cualquier ayuda sería genial, ¿estoy resolviendo este problema mal?