Rails 5 - создание «Комментариев» для «Статьи» с отношением has_many между ними - PullRequest
0 голосов
/ 31 января 2019

Мои вопросы касаются раздела 6.4 официального Руководства по Rails

У меня есть статьи и комментарии модель с отношением has_manyмежду ними.Теперь мы редактируем шаблон шоу Article (app / views / article / show.html.erb), чтобы мы могли сделать новый комментарий для каждой статьи:

<p>
  <strong>Title:</strong>
  <%= @article.title %>
</p>

<p>
  <strong>Text:</strong>
  <%= @article.text %>
</p>

<h2>Add a comment:</h2>
<%= form_with(model: [ @article, @article.comments.build ], local: true) do |form| %>
  <p>
    <%= form.label :commenter %><br>
    <%= form.text_field :commenter %>
  </p>
  <p>
    <%= form.label :body %><br>
    <%= form.text_area :body %>
  </p>
  <p>
    <%= form.submit %>
  </p>
<% end %>

<%= link_to 'Edit', edit_article_path(@article) %> |
<%= link_to 'Back', articles_path %>

Может ли кто-нибудь ELI5 объявить form_with?

form_with (модель: [@article, @ article.comments.build], local: true)

Я понимаю, что каждый комментарий должен быть создан для конкретной статьи иописание в руководстве также упоминает, что вызов form_with здесь использует массив, но зачем нам передавать массив в модель:?и почему у нас есть два члена в массиве?Что если мы просто передадим @article.comments модели:?Каково значение вызова функции .build по сравнению с вызовом @article.comments.create, используемым в comments_controller.rb?

1 Ответ

0 голосов
/ 31 января 2019

Rails генерирует маршруты из form_with.Давайте рассмотрим этот случай:

<%= form_with(@article) do |f| %>
 ...
<% end %>

, когда статья новая и отсутствует в базе данных, Rails определит, что маршрут будет:

articles_path(@article), action: :create

, потому что вы создаете новуюone.

Если статья существует в базе данных, Rails генерирует маршрут обновления:

articles_path(@article), action: :update

Следовательно, массив означает, что путь будет вложенным.Итак, этот код:

<%= form_with([@article, @article.comments.build]) do |f| %>
 ...
<% end %>

Создает этот маршрут, если комментарий не существует в базе данных:

article_comments_path(@article, @article.comments.build), action: :create

В противном случае маршрут будет:

article_comments_path(@article, @comment), action: :update

Подробнее о разнице между new и build: В чем разница между сборкой и новой на Rails?

Подробнее о сравнении form_for, form_with и form_tag https://m.patrikonrails.com/rails-5-1s-form-with-vs-old-form-helpers-3a5f72a8c78a

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...