Я работаю над приложением, напоминающим приложение для бронирования библиотек. Я застрял в создании вложенной формы для добавления новой книги. У меня есть форма, работающая для отношений «один ко многим» (изображения для книги и т. д.), но я также хочу ВЫБРАТЬ и привязать существующего автора к этой книге (у книги много авторов, а у автора много книг через< /em> таблица вкладов) с помощью collection_select.
При отправке формы она не делает запись в таблице соединения с book_id и author_id. (Мне удалось заставить его работать с простыми полями text_entry при создании нового автора, но collection_select просто не работает. Прежде чем добавить reject_if к accepts_nested_attributes, он продолжал создавать нового автора с пустыми first_name и last_name и делать запись в присоединиться к таблице с этим пустым новым автором)
Вот моя форма, разделенная на важные части
<%= form_for @book do |f| %>
<div class="panel panel-default">
<div class="panel-body">
<%= f.label :name, "Book title" %>
<%= f.text_field :name %>
<%= f.label :description %>
<%= f.text_area :description, rows: 5 %>
<%= f.label :year_of_publication %>
<%= f.text_field :year_of_publication %>
</div>
</div>
<div class="panel panel-default">
<div class="panel-body">
<h3>Add authors</h3>
<h4>Choose from existing authors</h4>
<%= f.fields_for :authors do |builder| %>
<%= builder.collection_select( :id, Author.all, :id, :full_name, prompt: "Select from existing authors") %>
<% end %>
</div>
</div>
<%= f.submit "Submit", class: "btn btn-info" %>
<% end %>
И это HTML, отображаемый в настоящее время для collection_select
<select id="book_authors_attributes_0_id" name="book[authors_attributes][0][id]"><option value="">Select from existing authors</option>
<option value="1">Berman, Jules J.</option>
<option value="2">Writerton, Andy R.</option>
<option value="3">Goldner, Merle</option>
<option value="4">Auer, Cordell</option>
<option value="5">Metz, Dewitt</option>
<option value="6">Leffler, Briana</option>
<option value="7">Trantow, Audra</option>
<option value="8">Murazik, Ebony</option>
<option value="9">Bahringer, Cale</option>
<option value="10">Schmitt, Wiley</option>
<option value="11">Casper, Zoe</option>
Вот моя модель книги.
class Book < ActiveRecord::Base
# default_scope -> { order('name ASC') }
validates :year_of_publication, presence: true
validates :description, presence: true
validates :name, presence: true
has_many :stock_items, dependent: :destroy
has_many :libraries, through: :stock_items
has_many :contributions, dependent: :destroy
has_many :authors, through: :contributions
has_many :bookings, through: :stock_items
has_many :book_images, dependent: :destroy
accepts_nested_attributes_for :book_images
accepts_nested_attributes_for :authors, :allow_destroy => true, :reject_if => proc {|attributes| attributes['last_name'].blank? }
accepts_nested_attributes_for :libraries
accepts_nested_attributes_for :stock_items
accepts_nested_attributes_for :contributions
validates :name, presence: true
# validate year of pub length to 4
end
И моя авторская модель.
class Author < ActiveRecord::Base
validates :first_name, presence: true
validates :last_name, presence: true
has_many :contributions, dependent: :destroy
has_many :books, through: :contributions
def full_name
"#{last_name}, #{first_name}"
end
end
Модель вклада (таблица соединений)
class Contribution < ActiveRecord::Base
belongs_to :author
belongs_to :book
validates :author_id, presence: true
validates :book_id, presence: true
end
Соответствующие части схемы
create_table "authors", force: true do |t|
t.string "last_name"
t.string "first_name"
t.datetime "created_at"
t.datetime "updated_at"
end
create_table "contributions", force: true do |t|
t.integer "book_id"
t.integer "author_id"
t.datetime "created_at"
t.datetime "updated_at"
end
create_table "books", force: true do |t|
t.string "name"
t.datetime "created_at"
t.datetime "updated_at"
t.string "year_of_publication"
t.string "description"
end
Мои действия new и create в BooksController
def new
@book = Book.new
# Displays empty fields in the new book action view (n.times)
1.times { @book.authors.build }
1.times { @book.book_images.build }
@book.stock_items.build
end
def create
@book = Book.new(book_params)
if @book.save
redirect_to @book
flash[:success] = "Book added"
else
render 'new'
flash.now[:danger] = "Book NOT added"
end
end
Мои параметры_книги
частный
def book_params
# Include the nested parameters in the strong parameters as model_name_attributes !!!!!!!!!!
params.require(:book).permit( :name,
:description,
:year_of_publication,
authors_attributes: [ :first_name, :last_name ],
book_images_attributes: [ :image_url, :book_id ],
libraries_attributes: [ :name ],
stock_item_attributes: [ :book_id, :library_id ],
contribution_attributes: [ :book_id, :author_id ])
end
<%= builder.collection_select( :id, Author.all, :id, :full_name, prompt: "Select from existing authors") %>
не должна быть<%= builder.collection_select(:author_id, Author.all, :id, :full_name, prompt: "Select from existing authors") %>
? - person Pavan   schedule 16.06.2014log info
после отправкиform
? - person Pavan   schedule 16.06.2014<%= f.fields_for :authors do |builder| %>
на<%= f.fields_for :contributions do |builder| %>
и попробовать мое первое предложение. - person Pavan   schedule 16.06.2014<select id="book_contributions_attributes_0_author_id" name="book[contributions_attributes][0][author_id]">
- person Mihkel Mark   schedule 16.06.2014"contributions_attributes"=>{"0"=>{"author_id"=>"33"}},
, которые являются идентификатором правильного автора, которого я выбрал из раскрывающегося списка. - person Mihkel Mark   schedule 16.06.2014validates :book_id, presence: true
из режима взносов. - person Pavan   schedule 16.06.2014{"utf8"=>"✓", "authenticity_token"=>"NKhJhFicid/SPNYkYzQ7oZ.....", "book"=>{"name"=>"Alice in Wonderland", "description"=>"Foo bar baz etc", "year_of_publication"=>"1865", "contributions_attributes"=>{"0"=>{"author_id"=>"33"}}, "book_images_attributes"=>{"0"=>{"image_url"=>"http://blogs.slj.com/afuse8production/files/2012/05/AliceWonderland22.jpg"}}, "stock_items_attributes"=>{"0"=>{"book_id"=>"", "library_id"=>"3"}}}, "commit"=>"Submit", "action"=>"create", "controller"=>"books"}
Между прочим, соединение stock_items также использует выбор коллекции, и я тоже не могу заставить его работать. (Это book_id?) - person Mihkel Mark   schedule 16.06.2014