web-dev-qa-db-fra.com

SimpleForm sans pour (forme non modèle)

Est-il possible d'utiliser Simple Form (par: Plataformatec) sans modèle?

https://github.com/plataformatec/simple_form

72
Edward Ford

Vous pouvez utiliser :symbol comme premier argument.

<%= simple_form_for :user, url: users_path do |f| %>
  <%= f.input :name, as: :string %>
  ...
<% end %>

Il produira quelque chose comme ceci:

<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>
115
htanata

Malheureusement, simple_form repose sur l'utilisation d'un modèle. Essentiellement, ce serait bien d'avoir quelque chose comme des méthodes simple_form_tag et input_tag équivalentes à leurs Rails * _tag helpers. Jusque-là, il y a un travail facile à faire.

Utilisez un symbole au lieu de la classe dans le formulaire et passez la valeur explicitement pour empêcher simple_form d'essayer d'accéder aux propriétés du modèle.

<%= simple_form_for :user, :url => '/users' do |f| %>
  <%= f.text_field :name, input_html: { value: nil } %>
<% end %>

Cela évitera le undefined method 'name' for User Erreur.

16
Miguel Madero

Vous pouvez également utiliser des champs en dehors du modèle dans un modèle de formulaire, avec simple_fields_for comme ceci:

<%= simple_form_for @user do |f| %>
  <%= f.input :name %>

  <%= simple_fields_for :no_model_fields do |n| %>
    <%= n.input :other_field %>
  <% end %>
<% end %>

C'est une solution simple et pratique, car vous pouvez créer différents types de champs à partir de différents modèles ou sans utiliser de modèles

9
jacr1614

Toutes les méthodes ci-dessus vous laissent toujours des données de formulaire imbriquées dans "utilisateur" ou tout autre symbole que vous passez comme premier argument. C'est ennuyeux.

Pour imiter le style/les avantages de simple_form, mais supprimer la dépendance objet/symbole et l'imbrication forcée des données, vous pouvez créer un partiel.

HAML exemples:

vue formulaire:

= form_tag("path/to/action", method: "POST") do
    = render "path/to/partial/field", type: "string", required: true, item: "first_name"

field partiel:

- 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
FreePender

Vous pouvez également passer un :symbol au lieu de @object comme argument pour simple_form_for.

<%= simple_form_for :email, :url => '/post_email' do |f| %>
  <%= f.input :subject, :as => :string %>
<% end %>

Ce qui produirait:

<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>

Veuillez noter les inconvénients suivants:

  • Vous ne pourrez pas profiter de la validation automatique du modèle
  • Besoin de définir explicitement :url et le type de chaque input
4
Trung Lê