我已经通过跟随http://railscasts.com/episodes/196-nested-model-form-revised实施了一个模型“作者”的测试应用程序,其中包含许多“书籍”。我在我的例子中只使用了一个简单的关系,没有别的。
该应用程序运行良好,我可以使用“link_to_add_fields”等动态添加和删除书籍。保存,修改,删除按预期工作。
表格如下:
<%= simple_form_for(@author) do |author_form| %>
<%= author_form.input :name %><br />
<%= author_form.input :born %><br />
<h1>Books by this author</h1>
<!-- will Assume @author.books (somehow...) -->
<%= author_form.simple_fields_for :books do |book_fields| %>
<%= render partial: "book_fields", locals: {f: book_fields} %>
<% end %>
<%= link_to_add_fields "Add Book", author_form, :books %>
<%= author_form.submit %>
<% end %>
我还有一个部分“_book_fields.html.erb”,可以从编辑视图和JS代码中使用。
<fieldset class="book">
<%= f.input :title %><br />
<%= f.input :pages %><br />
<%= f.hidden_field :_destroy %>
<%= link_to "remove", '#', class: "remove_fields" %>
</fieldset>
我还有一个Cover字段,我使用Paperclip上传图片,但为了简洁,我将其删除了。
我遇到的问题是,现在我想创建一个“为作者添加单本书”-action / view。我无法理解部分应该如何使用。
假设我有一个Author-action查找Author-id,并创建一个空书(使用@author.books.build
?)如何在视图中显示这样的表单,以便唯一可行的操作是将另一本书添加到Author.books数组?我可以使用现有的部分吗?
让我们说我想要另一个单独的动作/视图与删除作者的书,这将如何工作?
答案 0 :(得分:0)
要有富有表现力和干扰的代码我:
首先,重命名要重用的部分,选择名称很困难。
其次,假设您在AuthorsController
中有两项操作:new_one
和new_many
。这里的名字很难。然后,您将拥有app/views/authors/new_one.html.erb
和app/views/authors/new_many.html.erb
第三,我会将你的重命名部分称为:
# new_one
= render partial: 'renamed_partial', locals: { link_to_add: false }
# new_many
= render partial: 'renamed_partial', locals: { link_to_add: true }
你重命名的部分会改变:
<%= simple_form_for(@author) do |author_form| %>
<%= author_form.input :name %><br />
<%= author_form.input :born %><br />
<h1>Books by this author</h1>
<!-- will Assume @author.books (somehow...) -->
<%= author_form.simple_fields_for :books do |book_fields| %>
<%= render partial: "book_fields", locals: {f: book_fields} %>
<% end %>
<%#### Here is the change! ####%>
<%= link_to_add_fields "Add Book", author_form, :books if link_to_add %>
<%= author_form.submit %>
<% end %>
我忘记了,你是对的,你应该使用@author.books.build
添加一本新书。
答案 1 :(得分:0)
替代到 juanpastas 回答,这里的代码更多。在此之后,您将获得一个自定义操作,为作者添加一本书。
authors / show.html.erb 中的
<%= link_to 'Add book', add_book_author_path(@author) %>
在 app / controllers / authors_controller.rb
中def add_book
@author = Author.find(params[:id])
@book = @author.books.new
end
routes.rb 中的
resources :authors do
member do
get 'add_book'
end
end
在 app / views / authors / add_book.html.erb 中,您可以使用_form.html.erb
呈现图书render partial: /books/form
或撰写自己的表单:
<%= form_for @book do |f| %>
<%= f.text_field :title %>
<%= f.submit %>
<% end %>
与下方评论相关的修改
irb(main):001:0> user = User.last
User Load (0.4ms) SELECT `users`.* FROM `users` ORDER BY `users`.`id` DESC LIMIT 1
=> #<User id: 4, email: "vcina@bk.ru", encrypted_password: "$2a$10$Rw3x2SadeYdubWa1uYc7oeIJnLe3B8nbjYcw0iPbbnZO...", reset_password_token: nil, reset_password_sent_at: nil, remember_created_at: nil, sign_in_count: 0, current_sign_in_at: nil, last_sign_in_at: nil, current_sign_in_ip: nil, last_sign_in_ip: nil, created_at: "2013-06-05 13:51:54", updated_at: "2013-06-05 13:51:54", first_name: "Vcina", last_name: "Dmitrii", role: "user", approved: false>
这里用户被加载到用户变量中,假装它是你的作者。接下来我们要为该用户添加一个新公司,假装公司是您的案例中的一本书:
irb(main):002:0> user.companies.new
=> #<Company id: nil, user_id: 4, responsible_id: nil, name: nil, company_branch_id: nil, company_source_id: nil, client_category_id: nil, client_type_id: nil, client_at: nil, phone: nil, fax: nil, email: nil, skype: nil, website: nil, facebook: nil, bank_req: nil, fisc_id: nil, created_at: nil, updated_at: nil, client_status_id: nil, number_employees: nil, organizational_form_id: nil, marked_to_remove: false>
查看日志中的user_id
,它是我们之前加载的用户的ID,剩下要做的就是填写书名或其他任何内容的字段并按提交。
在提交时,将调用操作create
,该操作将使用您将随请求发送的图书的参数创建一本书。