Ruby on rails 如何创建将书籍添加到作者的单独操作/视图
我已经实现了一个带有模型的testapp,作者有很多书。在我的示例中,我只使用了一个简单的关系,没有其他关系 该应用程序运行完美,我可以使用link\u to\u add\u字段等向作者动态添加和删除书籍。保存、修改、删除作品 表单如下所示:Ruby on rails 如何创建将书籍添加到作者的单独操作/视图,ruby-on-rails,activerecord,Ruby On Rails,Activerecord,我已经实现了一个带有模型的testapp,作者有很多书。在我的示例中,我只使用了一个简单的关系,没有其他关系 该应用程序运行完美,我可以使用link\u to\u add\u字段等向作者动态添加和删除书籍。保存、修改、删除作品 表单如下所示: <%= simple_form_for(@author) do |author_form| %> <%= author_form.input :name %><br /> <%= author_form.inp
<%= 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 %>
# new_one
= render partial: 'renamed_partial', locals: { link_to_add: false }
# new_many
= render partial: 'renamed_partial', locals: { link_to_add: true }
我还有一个部分_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>
我还有一个封面,我用回形针上传了一张照片,但为了简洁起见我删除了它
我遇到的问题是,现在我想创建一个向作者操作/视图添加一本书。我不知道该如何使用分部词
假设我有一个Author操作,它查找一个Author id,并使用@Author.books.build创建一本空书?如何在视图中显示这样的表单,以便唯一可能的操作是将另一本书添加到Author.books数组中?我可以使用现有的分部代码吗
假设我想要另一个单独的操作/视图,将书从作者处移除,这将如何工作?要有一个表达性的、干燥的代码I: 首先,重命名要重用的部分,选择一个名称是困难的 第二,假设在AuthorsController中有两个操作:new_one和new_many。这里的名字很难。然后,您将拥有app/views/authors/new_one.html.erb和app/views/authors/new_many.html.erb 第三,我会这样称呼你的名字:
<%= 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 %>
# 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来添加一本新书。作为Juanpasta答案的替代,这里有更多代码。在此之后,您将获得一个自定义操作来为作者添加一本书
在authors/show.html.erb中
在routes.rb中
在app/views/authors/add_book.html.erb中,您可以使用render partial:/books/form渲染书籍_form.html.erb或编写自己的表单:
<%= form_for @book do |f| %>
<%= f.text_field :title %>
<%= f.submit %>
<% end %>
编辑下面与评论相关的内容
在这里,用户被加载到用户变量中,假设它是您的作者。接下来,我们要为该用户添加一个新公司,假设该公司是您案例中的一本书:
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>
查看日志中的用户id,这是我们之前加载的用户id,剩下要做的就是填写书籍标题或其他内容的字段,然后按submit
提交时,将调用创建操作,该操作将使用您将随请求发送的book参数创建一本书。OK这似乎是一个足够简单的解决方案。不过,控制器中有一个变化:它应该是@book=@author.books.build,对吗?不完全是,它通过说@author.books.new来表示它已经知道谁是这本书的作者了。我会在几分钟内给你一个用户和公司的例子,我不明白。我的解释是:如果我使用@author.books.build,新书将自动设置Book.author\u id。这不是比使用@author.books.new:author\u id=>@author.id好很多吗?它还被添加到books数组中,而new数组则没有。要坚持下去,我必须打电话@author.save。请参阅@author.books.build,如果我想一次为该作者添加更多书籍,我会使用它,如果只有一本,则无需使用生成器。@author.books.newtitle:Nice book将返回您,保存后它将创建一本id为4的作者的书籍。这看起来是正确的rails解决方法。我一有时间就去测试一下。
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>