SimpleForm без for (не модельная форма) - PullRequest
72 голосов
/ 03 марта 2011

Можно ли использовать простую форму (от Plataformatec) без модели?

https://github.com/plataformatec/simple_form

Ответы [ 5 ]

114 голосов
/ 03 марта 2011

Вы можете использовать :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>
16 голосов
/ 02 июля 2013

К сожалению, 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.

9 голосов
/ 05 августа 2016

Вы также можете использовать поля вне модели внутри модели формы, например 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 %>

Это простое и практичное решение, поскольку вы можете создавать поля разного типа из разных моделей или без использования моделей

4 голосов
/ 17 ноября 2014

Все вышеперечисленные методы все еще оставляют вас с данными формы, вложенными в «user» или любой символ, который вы передаете в качестве первого аргумента. Это раздражает.

Чтобы имитировать стиль / преимущества 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}" }
4 голосов
/ 07 марта 2013

Вы также можете передать :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
...