Как form_with знает, какой метод вызывать внутри модели? - PullRequest
1 голос
/ 19 июня 2019

Мне трудно понять, как работает form_with. Чтобы понять основное использование form_with, я посмотрел, как Rails настроил его в процессе rails g scaffold.

Я создал каркас оборудования и в нем я посмотрел, как настраивается форма в файле _form.html.erb.

<%= form_with(model: equipment, local: true) do |form| %>
  <div class="container">
    <div class="row">
      <div class="col col-lg-10 col-offset-left-1">
        <div class="form-group">
          <%= form.label :name %><br />
          <%= form.text_field :name, placeholder: "equipment name", class: "form-control" %>
        </div>
        </div>
      </div>
    </div>
  </div>
  <div class="actions">
    <%= form.submit %>
  </div>
<% end %>

Оказалось, я все еще запутался, как форма знает, что эта форма должна создавать новое оборудование или редактировать существующее оборудование? Форма указывает только модель, но я не могу найти, где указан метод.

Кто-нибудь сможет указать мне правильное направление? спасибо

Ответы [ 2 ]

3 голосов
/ 19 июня 2019

достаточно указать модель, потому что метод form_with может проверить, если модель (уже сохранена) отправит запрос на исправление или модель (новая модель), поэтому отправит запрос на публикацию.Активная запись уже имеет некоторые функции, которые нужно использовать, чтобы узнать, является ли запись новой или сохраненной

 equipment.new_record? # returns true when the model is new and false if saved 
 equipment. persisted? # returns false when the model is new and true if saved 

Исходный код Rails здесь показывает, что https://github.com/rails/rails/blob/c87f6841b77e5827ca7bd03a629e2d615fae0d06/actionview/lib/action_view/helpers/form_helper.rb#L1530 метод также может легко узнать путь запросаот модели, аналогичной path_for

1 голос
/ 19 июня 2019

Ваш кодовый блок:

<%= form_with(model: equipment, local: true) do |form| %>
  <div class="container">
    <div class="row">
      <div class="col col-lg-10 col-offset-left-1">
        <div class="form-group">
          <%= form.label :name %><br />
          <%= form.text_field :name, placeholder: "equipment name", class: "form-control" %>
        </div>
        </div>
      </div>
    </div>
  </div>
  <div class="actions">
    <%= form.submit %>
  </div>
<% end %>

отобразит что-то вроде этого:

<form action=”/equipments” accept-charset=”UTF-8" method=”post” data-remote=”true”>
 <input name=”utf8" type=”hidden” value=”✓”>
 <input type=”hidden” name=”authenticity_token” value=”…”>
 <input type=”text” name=”post[name]”>
 <input type=”submit” name=”commit” value=”Create” data-disable-with=”Create”>
</form>

Теперь помощник вида form_with использует URL-адрес, чтобы узнать, каково значение model, и соответствующим образом отобразить форму.

DHH выпустил выпуск , объясняя причину введения form_with

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