2009-11-25 2 views
6

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

18

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!

+1

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

-1

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.

+0

Gradirei un commento sul voto negativo. – Sid

+1

Direi che è perché l'OP sta cercando una soluzione semantica, idealmente usando Formtastic, e tu stai suggerendo un passo indietro. –

1

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.