2015-07-10 6 views
0

Я новичок в Rails, но я застрял. Я хотел бы создать форму, которая добавит данные в две таблицы (книги и books_authors). Мой взгляд выглядит следующим образом:Rails - форма HABTM

<%= form_for :book, url: book_path do |f| %> 
<p> 
    <%= f.label :title %> :<br/> 
    <%= f.text_field :title %><br/> 
<ul> 
    <% @authors.each do |x| %> 
    <li> <%= f.check_box {...} %> <%= x.name + " " + x.surname%></li> 
    <% end %> 
</ul> 
</p> 
<p><%= f.submit %></p> 

и мой метод создание в контроллере books_controller.rb выглядит следующим образом:

def create 
    @book = Book.new(params.require(:book).permit(:title)) 
    @book.save 
    params[:authors].each do |author_id| 
    book.authors << Author.find(author_id) 
    end 
    redirect_to root_path 
end 

и моя схема:

ActiveRecord::Schema.define(version: 20150709110928) do 

create_table "author_books", id: false, force: :cascade do |t| 
    t.integer "author_id" 
    t.integer "book_id" 
    t.datetime "created_at", null: false 
    t.datetime "updated_at", null: false 
end 

add_index "author_books", ["author_id"], name: 
      "index_author_books_on_author_id" 
add_index "author_books", ["book_id"],  
      name:"index_author_books_on_book_id" 

create_table "authors", force: :cascade do |t| 
    t.string "name" 
    t.string "surname" 
    t.datetime "created_at", null: false 
    t.datetime "updated_at", null: false 
end 

create_table "books", force: :cascade do |t| 
    t.string "title" 
    t.datetime "created_at", null: false 
    t.datetime "updated_at", null: false 
end 

end 

мне нужен Params для: авторы но я не знаю, как вложить его в форму

+0

Можете ли вы добавить информацию о своей схеме, например ассоциации, на свой вопрос, пожалуйста? –

+0

Является ли этот 'f.check_box {...}' ваш фактический код? –

+0

Я подозреваю, что мне нужно добавить что-то внутри скобок {...} – mike927

ответ

4

I п ваш _form

<% @authors.each do |author| %> 
    <%= check_box_tag "author_ids[]", author.id %> 
    <%= author.name %> // I assume that your author has a name which can be used as a label 
<% end %> 

в контроллере,

def create 
    // you will get the authors in params[:author_ids] 
    @book = Book.new(params.require(:book).permit(:title, :author_ids => [])) // its a dirty code 
    // skip other codes 
end 

свежий код для контроллера

определить частный метод и положить

def book_params 
params.require(:book).permit(:title, :author_ids => []) 
end 

и в

def create 
    @book = Book.new(book_params) 
end 
+0

Я только что добавил свою схему, вы можете посмотреть, что – mike927

+0

@ mike927, как я вижу из вашего вопроса, вы столкнулись с проблемой получения «авторов» в контроллере. Мой ответ - это решение вашей проблемы. Теперь используйте 'params [: author_ids]' для сохранения. если вы правильно установили модель «Книга» и «Автор», то ее легко сохранить значения. – Emu

+0

authors_id, поданный в params, не имеет структуры ключевого значения. он хранит только идентификаторы и выглядит так: «author_ids» => ["2", "3"], – mike927