SimpleForm без for (немодель)


77

Чи можна використовувати просту форму (автор: Plataformatec) без моделі?

https://github.com/plataformatec/simple_form


Можливо, [моя відповідь на інше питання] [1] допоможе вам. [1]: stackoverflow.com/a/14659270/157816
baxang

Відповіді:


123

Ви можете використовувати :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>

4
@toxaq Можливо, це не хороший приклад. Ви можете використовувати f.input :name, :as => :stringта генерувати свою звичну форму з міткою, підказками тощо
htanata

8
Як не дивно, це саме те, що я намагаюся зробити і не маю успіху. Ваш приклад дає undefined method 'name?' for nil:NilClassпринаймні для мене.
toxaq

11
У цьому варіанті як і раніше використовується модель під ковдрами. Символ повинен відповідати назві моделі, він перетвориться на модель і створить нову та використовуватиме її в кожному полі, тому властивості, що використовуються у полях форми, насправді повинні існувати в моделі.
Мігель Мадеро

18
Я не розумію, чому це прийнята відповідь, бо відповідь просто неправильна.
Філіпп,

1
Так, я думаю, що раніше я пропустив суть і написав кращу відповідь як коментар . Я оновив відповідь, щоб він робив те, що повинен робити simple_form.
htanata

17

На жаль, 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помилки.


2
Це працювало у мене: <% = f.input: create_key, input_html: {value: nil}, обов’язково: true, підказка: "лише за запрошенням, див. Електронний лист для ключа"%>
codenoob

1
Якщо ви працюєте з колекцією, використовуйте selectedзамість valueтого, щоб уникнути undefined method 'name' for Modelпомилки
fkoessler

13

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

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

3
У цьому варіанті все ще використовується модель під ковдрами. Символ повинен відповідати назві моделі, він перетвориться на модель і створить нову та використає її в кожному полі, тому властивості, що використовуються в полях форми, насправді повинні існувати в моделі.
Мігель Мадеро

4

Всі наведені вище методи все ще залишають вам дані форми, вкладені всередину "користувача", або будь-який символ, який ви передаєте як перший аргумент. Це дратує.

Щоб імітувати стиль / переваги 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}" }
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.