如何创建将Book添加到作者的单独操作/视图

时间:2013-07-15 07:47:39

标签: ruby-on-rails activerecord

我已经通过跟随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数组?我可以使用现有的部分吗?

让我们说我想要另一个单独的动作/视图与删除作者的书,这将如何工作?

2 个答案:

答案 0 :(得分:0)

要有富有表现力和干扰的代码我:

首先,重命名要重用的部分,选择名称很困难。

其次,假设您在AuthorsController中有两项操作:new_onenew_many。这里的名字很难。然后,您将拥有app/views/authors/new_one.html.erbapp/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,该操作将使用您将随请求发送的图书的参数创建一本书。