1

我通过遵循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 上传图片,但为简洁起见,我将其删除。

我遇到的问题是,现在我想创建一个“将单本书添加到作者”-动作/视图。我无法理解应该如何使用部分。

假设我有一个查找作者 ID 的作者操作,并创建一个空书(使用@author.books.build?)我如何在视图中显示这样的表单,以便唯一可能的操作是将另一本书添加到作者。书籍阵列?我可以使用现有的部分吗?

假设我想要另一个单独的操作/视图,从作者那里删除书,那将如何工作?

4

2 回答 2

0

要拥有一个富有表现力和干燥的代码,我:

首先,重命名那部分要重用,取一个名字是困难的。

其次,假设您在AuthorsController:new_onenew_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添加一本新书。

于 2013-07-15T08:16:36.127 回答
0

juanpastas答案的替代方案,这里有更多代码。在此之后,您将获得一个自定义操作来为作者添加一本书。

作者/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

路线.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将调用该操作,该操作将使用您将随请求发送的书籍参数创建一本书。

于 2013-07-15T08:23:55.970 回答