SimpleForm ohne for (Nichtmodellform)

Antworten:

123

Sie können :symbolals erstes Argument verwenden.

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

Es wird ungefähr so ​​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>
htanata
quelle
4
@toxaq Vielleicht ist das kein gutes Beispiel. Sie können f.input :name, :as => :stringIhr übliches Formular mit Beschriftung, Hinweisen usw. verwenden und generieren
htanata
8
Seltsamerweise versuche ich genau das zu tun und habe keinen Erfolg. Ihr Beispiel gibt undefined method 'name?' for nil:NilClassmir zumindest ein.
Toxaq
11
Diese Option verwendet weiterhin ein Modell unter der Decke. Das Symbol sollte mit einem Modellnamen übereinstimmen. Es wird in ein Modell aufgelöst, ein neues erstellt und in jedem Feld verwendet, sodass die in den Formularfeldern verwendeten Eigenschaften tatsächlich im Modell vorhanden sein sollten.
Miguel Madero
18
Ich verstehe nicht, warum dies die akzeptierte Antwort ist, weil die Antwort einfach falsch ist.
Phillipp
1
Ja, ich glaube, ich habe den Punkt zuvor verpasst und eine bessere Antwort als Kommentar geschrieben . Ich habe die Antwort aktualisiert, damit sie genau das tut, was simple_form tun soll.
Htanata
17

Leider ist simple_form auf die Verwendung eines Modells angewiesen. Im Wesentlichen wäre es schön, so etwas wie simple_form_tag- und input_tag-Methoden zu haben, die ihren Rails * _tag-Helfern entsprechen. Bis dahin gibt es eine einfache Lösung.

Verwenden Sie ein Symbol anstelle der Klasse im Formular 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 %>

Dadurch wird der undefined method 'name' for UserFehler vermieden.

Miguel Madero
quelle
2
Dies funktionierte für mich: <% = f.input: create_key, input_html: {value: nil}, erforderlich: true, Hinweis: "Nur auf Einladung, siehe E-Mail für Schlüssel"%>
codenoob
1
Wenn Sie mit einer Sammlung arbeiten, verwenden Sie selectedstatt value, um den undefined method 'name' for ModelFehler zu vermeiden
fkoessler
13

Sie können auch Felder außerhalb des Modells innerhalb eines Formularmodells verwenden, wobei simple_fields_ für Folgendes gilt:

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

jacr1614
quelle
4

Sie können auch ein :symbolstatt @objectals Argument für übergeben simple_form_for.

<%= 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:

  • Sie können die automatische Modellvalidierung nicht nutzen
  • Müssen explizit definieren :urlund den Typ von jedeminput
Trung Lê
quelle
3
Diese Option verwendet weiterhin ein Modell unter der Decke. Das Symbol sollte mit einem Modellnamen übereinstimmen. Es wird in ein Modell aufgelöst, ein neues erstellt und in jedem Feld verwendet, sodass die in den Formularfeldern verwendeten Eigenschaften tatsächlich im Modell vorhanden sein sollten.
Miguel Madero
4

Bei allen oben genannten Methoden bleiben Ihnen weiterhin Formulardaten, die in "Benutzer" oder einem beliebigen Symbol verschachtelt sind, das Sie als erstes Argument übergeben. Das nervt.

Um den Stil / die Vorteile von simple_form nachzuahmen, 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}" }
FreePender
quelle