SimpleForm без for (не модельная форма)
можно ли использовать простую форму (по: Plataformatec) без модели?
5 ответов:
можно использовать
: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>
к сожалению 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
ошибка.
вы также можете использовать поля вне модели в модели формы, с 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 %>
Это простое и практичное решение, потому что вы можете создавать различные типы полей из разных моделей или без использования моделей
все вышеуказанные методы по-прежнему оставляют вас с данными формы, вложенных в "пользователей" или любой символ, который вы передаете в качестве первого аргумента. Это раздражает.
чтобы имитировать стиль/преимущества 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}" }
вы также можете пройти
: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