Чи можна використовувати просту форму (автор: Plataformatec) без моделі?
Чи можна використовувати просту форму (автор: Plataformatec) без моделі?
Відповіді:
Ви можете використовувати :symbol
як перший аргумент.
<%= simple_form_for :user, url: users_path do |f| %>
<%= f.input :name, as: :string %>
...
<% end %>
Виведеться приблизно таке:
<form novalidate="novalidate" class="simple_form user" action="/users" accept-charset="UTF-8" method="post">
...
<div class="input string required user_name">
<label class="string required" for="user_name">
<abbr title="required">*</abbr> Name
</label>
<input class="string required" type="text" name="user[name]" id="user_name" />
</div>
...
</form>
f.input :name, :as => :string
та генерувати свою звичну форму з міткою, підказками тощо
undefined method 'name?' for nil:NilClass
принаймні для мене.
На жаль, simple_form покладається на використання моделі. По суті, було б непогано мати щось на зразок методів simple_form_tag та input_tag, еквівалентних їхнім помічникам rails * _tag. До цього часу існує легка робота.
Використовуйте символ замість класу у формі та передайте значення явно, щоб запобігти спробі simple_form отримати доступ до властивостей моделі.
<%= simple_form_for :user, :url => '/users' do |f| %>
<%= f.text_field :name, input_html: { value: nil } %>
<% end %>
Це дозволить уникнути undefined method 'name' for User
помилки.
selected
замість value
того, щоб уникнути undefined method 'name' for Model
помилки
Ви також можете використовувати поля поза моделлю в моделі форми, з simple_fields_for ось так:
<%= simple_form_for @user do |f| %>
<%= f.input :name %>
<%= simple_fields_for :no_model_fields do |n| %>
<%= n.input :other_field %>
<% end %>
<% end %>
Це просте і практичне рішення, оскільки ви можете створювати різні види полів з різних моделей або без використання моделей
Ви також можете передати :symbol
замість @object
аргументу simple_form_for
.
<%= simple_form_for :email, :url => '/post_email' do |f| %>
<%= f.input :subject, :as => :string %>
<% end %>
Що виведе:
<form method="post" class="simple_form email" action="/post_email" accept-charset="UTF-8">
...
<input type="text" size="30" name="email[subject]" id="email_subject">
</form>
Зверніть увагу на такі недоліки:
:url
і тип кожногоinput
Всі наведені вище методи все ще залишають вам дані форми, вкладені всередину "користувача", або будь-який символ, який ви передаєте як перший аргумент. Це дратує.
Щоб імітувати стиль / переваги simple_form, але видалити залежність об’єкта / символу та примусове вкладання даних, ви можете створити частковий.
HAML
приклади:
вигляд форми:
= form_tag("path/to/action", method: "POST") do
= render "path/to/partial/field", type: "string", required: true, item: "first_name"
field
частково:
- required_string = required ? "required" : ""
%div{class: "input #{type} #{required_string} #{item}"}
%label{class: "#{type} #{required_string}", for: "#{item}"}
- if required
%abbr{title: "required"}
*
= t("application.#{item}")
%input{name: "#{item}", |
placeholder: t("application.#{item}"), |
type: "#{type}", |
required: required, |
"aria-required" => "#{required}" }