A volte abbiamo bisogno di una forma senza creazione del modello, ad esempio campo di ricerca o email, dove dovrebbero essere inviate alcune istruzioni. Qual è il modo migliore per creare queste forme? Posso creare un modello virtuale o qualcosa del genere? Mi piacerebbe usare formtastic, ma non form_tag.modello virtuale e form_for (o formtastic)
risposta
In primo luogo, Formtastic non ha bisogno di un modello in tutti i casi, anche se sicuramente funziona meglio e richiede meno codice con un modello.
Proprio come lo stesso form_for
di Rails, è possibile passare un simbolo anziché un oggetto come primo argomento e Formtastic compilerà il modulo e pubblicherà i param in base al simbolo. Ad esempio:
<% semantic_form_for(:session) do |f| %>
...
<% end %>
Questo renderà i valori modulo disponibile per il controller come params[:session]
.
secondo luogo, un modello non significa un modello ActiveRecord. Quello che voglio dire è che Formtastic funzionerà con qualsiasi istanza di una classe che ciarla come come un modello di ActiveRecord.
Un classico esempio di ciò che molte persone utilizzano Authlogic per l'autenticazione con Formtastic. Parte del Authlogic è l'idea di un modello UserSession, che funziona bene:
Controller:
def index
@user_session = UserSession.new
end
Forma:
<% semantic_form_for(@user_session) do |f| %>
<%= f.input :login %>
<%= f.input :password %>
<% end %>
Questo renderà i dati del modulo disponibile nel vostro controller come params[:user_session]
.
È in realtà non è difficile creare un'istanza di modello per racchiudere le preoccupazioni del modello. Continua a implementare i metodi che Formtastic si aspetta finché non lo fai funzionare!
Oppure è sufficiente creare un modulo con form_for e lasciare il riferimento del modello vuoto. per esempio <% form_for "", :url=>some_url do |f| %>
<%= f.text_field "some_attribute" %>
<%= submit_tag "submit" %>
È possibile recuperare i valori da params semplicemente dicendo [:] some_attribute nel controller.
Gradirei un commento sul voto negativo. – Sid
Direi che è perché l'OP sta cercando una soluzione semantica, idealmente usando Formtastic, e tu stai suggerendo un passo indietro. –
default_language.rb
class DefaultLanguage attr_accessor :language_id end
foo_controller.rb
def index @default_language = params[:default_language] || Language.find_by_name("English") end
index.erb
<% semantic_form_for @default_language do |form| %> <% form.inputs :id => 'default_language' do %> <%= form.input :id, :as => :select, :collection => @languages, :required => false, :label => "Primary Language:", :include_blank => false %> <% end %> <% end %>
ho usato AJAX per inviare il modulo quando il valore è cambiato.
Accetto la tua sfida!Qui trovi una classe non ActiveRecord per "racchiudere le preoccupazioni del tuo modello". http://dondoh.tumblr.com/post/4142258573/formtastic-without-activerecord – dondo