Ist es möglich, Simple Form (von: Plataformatec) ohne Modell zu verwenden?
ruby-on-rails
ruby-on-rails-3
simple-form
Edward Ford
quelle
quelle
Antworten:
Sie können
:symbol
als 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>
quelle
f.input :name, :as => :string
Ihr übliches Formular mit Beschriftung, Hinweisen usw. verwenden und generierenundefined method 'name?' for nil:NilClass
mir zumindest ein.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 User
Fehler vermieden.quelle
selected
stattvalue
, um denundefined method 'name' for Model
Fehler zu vermeidenSie 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
quelle
Sie können auch ein
:symbol
statt@object
als Argument für übergebensimple_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:
:url
und den Typ von jedeminput
quelle
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}" }
quelle