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?