Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 如何创建将书籍添加到作者的单独操作/视图_Ruby On Rails_Activerecord - Fatal编程技术网

Ruby on rails 如何创建将书籍添加到作者的单独操作/视图

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

我已经实现了一个带有模型的testapp,作者有很多书。在我的示例中,我只使用了一个简单的关系,没有其他关系

该应用程序运行完美,我可以使用link\u to\u add\u字段等向作者动态添加和删除书籍。保存、修改、删除作品

表单如下所示:

<%= 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>