Различные способы использования simple_form в Ruby on Rails |В чем разница? - PullRequest
0 голосов
/ 22 мая 2018

В чем разница между этими методами адресации формы редактирования для "пакетов"?

Как эти разные подходы влияют на стабильность приложения?Это универсальность?

Где это может привести к серьезным проблемам?Почему один лучше другого?

  1. Через «метод»?<%= simple_form_for Pack.find(params[:id]), method: :patch do |f| %>
  2. Через объект <%= simple_form_for @pack, url: pack_path(@pack), method: :patch do |f| %>
  3. Через символ <%= simple_form_for :pack, url: pack_path(@pack), method: :patch do |f| %>

Любая информация была бы полезной, я хотел бы знать!

Ответы [ 3 ]

0 голосов
/ 22 мая 2018

Все три подхода дают одинаковую форму (при условии, что вы устанавливаете @pack равным Pack.find(params[:id]), однако есть и компромиссы:

  1. Не рекомендуется иметьВызов ActiveRecord в вашем коде представления. Представления должны просто отвечать за разметку формы, а не за запросы к базе данных. Поддержание этого разделения сделает долгосрочное обслуживание намного проще. Использование переменной также означает, что вы можете иметь одинаковую форму для обоихэкраны new и edit, установив @pack = Pack.new в вашем контроллере для представления new. По этим причинам я бы рекомендовал использовать опцию [1].

  2. Использование объекта (@pack) или символа (:pack) дает те же результаты, потому что внутренне помощник Rails form_for использует символ для поиска переменной. IMHO option [2] и прямая ссылка на объект: "лучше », потому что происходит меньше магии, поэтому людям, впервые участвующим в проекте (или вам через год), будет легче понять. Вариант [2] также согласуется с Rails docs и SimpleForm docs, поэтому для людей это не является неожиданностью.

0 голосов
/ 22 мая 2018

1.и 2. - Привязка помощника формы к экземпляру модели

в основном идентична, за исключением того факта, что в 2. вы ссылаетесь на экземпляр модели из переменной экземпляра, а не просто передаёте возвращаемое значение вызова метода.

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

Фактически все они будут давать один и тот же результат:

<% 
  @pack = Pack.find(params[:id]) 
  pack = Pack.find(params[:id]) 

%>

<%= simple_form_for Pack.find(params[:id]), method: :patch do |f| %>
<%= simple_form_for @pack |f| %>
<%= simple_form_for pack |f| %>

Но первое менее желательно, посколькувам следует избегать выполнения запросов непосредственно из представления.Представление должно получать данные из контроллера и использовать их для создания HTML, быть как можно более простым и декларативным.Другая серьезная проблема заключается в том, что .find вызовет ActiveRecord::RecordNotFoundError, который должен был быть обнаружен намного раньше в контроллере, если идентификатор недействителен.

3.Вызов помощников формы с символом:

<%= simple_form_for :pack, url: pack_path(@pack), method: :patch do |f| %>

Это создает форму, которая «ограничена» без необходимости привязки к конкретному экземпляру модели.Возьмите этот пример:

<%= simple_form_for :thing do  |f| %>
  <%= f.input :name %>
<% end %>

Это генерирует следующий HTML:

<form novalidate="novalidate" class="simple_form thing" action="/things/new" accept-charset="UTF-8" method="post">
  <input name="utf8" type="hidden" value="&#x2713;" /><input type="hidden" name="authenticity_token" value="F4r1gLuboZc1CKIdn9qac0sefxSVIvkjxk9KsD+sRl1wnVtEIKzHvWY0mPuLPvHI1Kcv3TIWD883YXHKXA+yJQ==" />
  <div class="input string required thing_name">
    <label class="string required" for="thing_name"><abbr title="required">*</abbr> Name</label>
    <input class="string required" type="text" name="thing[name]" id="thing_name" />
  </div>
</form>

Примечание name="thing[name]", что означает, что он даст хэш params, как если бы у нас был экземпляр модели:

{
   thing: {
     name: "foo"
   }
}

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

Обратите внимание, что Rails попытается разрешить локальную переменную @thing, но не выдаст ошибку, если она равна нулю.Поэтому использование этой формы, как правило, не рекомендуется, поскольку она может маскировать ошибки.

Лучший способ понять это поведение - прочитать документы для ActionView :: FormHelpers , которая SimpleForm - просто сахар сверхуиз.

0 голосов
/ 22 мая 2018

1 и 2 являются идентичными, если вы делаете @pack = Pack.find(params[:id]) в своем контроллере (и это обычно рекомендуется).

3 - это то, что вы не делаете, поскольку simple_form_for ожидает, что объект в качестве первого аргумента несимвол (вы можете спутать его с чем-то вроде form.input :name).Я рекомендую вам прочитать README драгоценного камня.

...