2015-11-05 3 views
2

У меня есть форма, которая передает вложенные атрибуты, которые она работает для «Ребенка», но «книги» не отображаются.Вложенные атрибуты и параметры Unpermitted

У меня есть 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 { @hire.build_book } 
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, books_attributes: [ :id, :book_id, :_destroy]) 
end 
end 

Хэш, который представляется как выглядит следующим образом:

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

Я не могу работать почему я получаю ошибку unpermitted params? Любой совет?

* EDIT - включен вид, как я теперь подозреваю, что это может играть роль *

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

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

<%= 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.label :book_id %><br> 
<%= books_form.select(:book_id, Book.all.collect {|a| [a.Title, a.id]}) -%> 
<% end %> 


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

ответ

0

Вы должны использовать следующее:

#app/controllers/hires_controller.rb 
class HiresController < ApplicationController 
    def new 
     @hire = Hire.new 
     2.times do 
     @hire.build_book 
     end 
    end 
end 

Остальное выглядит хорошо.

Проблема, которая у вас есть, довольно типична; когда вы используете f.fields_for, вам нужно построить ассоциативные объекты, иначе fields_for не будет создавать правильные имена полей.

Названия полей вы ищете будет [books_attributes][0][book_id] и т.д.


Поскольку ваша форма проходит все атрибуты, которые вы могли бы ожидать (без суффикса _attributes), я могу предположить только, что ваше здание из связанных объектов неправилен:

2.times { @hire.books.build } 

... должно быть ...

2.times { @hire.build_book } 

Если у вас есть особые ассоциации, вы должны построить ассоциативный объект сингулярно: build_object, в то время как с множественным числом вы можете использовать вызов plural.build.

+0

Hi Rich, спасибо. Я думаю ты прав. что-то, похоже, влияет на построение атрибутов. Я изменил код контроллера на «2.times @ hire.build_book end», но все еще имеет ту же проблему. Любые другие идеи? –

+0

Мне интересно, это связано с моими ассоциациями. Я говорю 'accepts_nested_attributes_for: book', но тогда мои' f.fields' предназначены для 'books', а мои атрибуты для' books'? –

+0

Собираясь получить немного еды, тогда будет выглядеть –