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="✓" /><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 - просто сахар сверхуиз.