Ist es möglich, Simple Form (von: Plataformatec) ohne Modell zu verwenden?
Sie können :symbol
als erstes Argument.
<%= simple_form_for :user, url: users_path do |f| %>
<%= f.input :name, as: :string %>
...
<% end %>
Es wird so etwas ausgegeben:
<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>
Leider ist simple_form auf die Verwendung eines Modells angewiesen. Im Grunde wäre es schön, wenn Simple_form_tag- und Input_tag-Methoden ihren Rails * _tag-Helfern entsprechen würden. Bis dahin gibt es eine leichte Lösung.
Verwenden Sie im Formular ein Symbol anstelle der Klasse und übergeben Sie den Wert explizit, um zu verhindern, dass simple_form versucht, auf die Modelleigenschaften zuzugreifen.
<%= simple_form_for :user, :url => '/users' do |f| %>
<%= f.text_field :name, input_html: { value: nil } %>
<% end %>
Dies vermeidet die undefined method 'name' for User
Error.
Sie können Felder auch außerhalb des Modells innerhalb eines Formularmodells verwenden.
<%= simple_form_for @user do |f| %>
<%= f.input :name %>
<%= simple_fields_for :no_model_fields do |n| %>
<%= n.input :other_field %>
<% end %>
<% end %>
Dies ist eine einfache und praktische Lösung, da Sie verschiedene Arten von Feldern aus verschiedenen Modellen oder ohne Verwendung von Modellen erstellen können
Bei allen oben genannten Methoden bleiben Formulardaten in "user" oder einem anderen Symbol, das Sie als erstes Argument übergeben, verschachtelt. Das nervt.
Um den Stil/die Vorteile von simple_form zu imitieren, aber die Objekt-/Symbolabhängigkeit und die erzwungene Datenverschachtelung zu entfernen, können Sie einen Teil erstellen.
HAML
Beispiele:
formularansicht:
= form_tag("path/to/action", method: "POST") do
= render "path/to/partial/field", type: "string", required: true, item: "first_name"
field
teilweise:
- 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}" }
Sie können auch ein :symbol
Anstelle von @object
Als Argument für simple_form_for
Übergeben.
<%= simple_form_for :email, :url => '/post_email' do |f| %>
<%= f.input :subject, :as => :string %>
<% end %>
Welches würde ausgeben:
<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>
Bitte beachten Sie folgende Nachteile:
:url
Und den Typ jedes input
definieren