2009-12-15 6 views
18

Je suis en train de faire une forme non-modèle en rubis sur des rails, la plupart des exemples que je ne trouve que avoir un champ (par exemple un champ de recherche) ou utiliser une ancienne façon d'écrire un formulaire comme celui-An Email Form with Ruby on RailsComment faire une forme non-modèle en rubis sur rails?

Si quelqu'un pouvait me montrer un exemple de code d'un formulaire non-modèle avec deux champs pour la vue et comment j'accède à ces champs dans le contrôleur, je serais reconnaissant.

Merci beaucoup.

+0

J'ai aussi remarqué quelques commentaires sur le web, sous-entendant que les formes non-modèle sont une douleur pour valider, cet être cas serait-il plus facile d'utiliser un style «formulaire pour» pour un formulaire de contact? – conspirisi

+0

Découvrez la gemme validable pour faciliter la validation des objets autres que les bases de données. http://github.com/jnunemaker/validatable –

+0

Pour restaurer les valeurs d'entrée en cas de validation échouée: http://stackoverflow.com/questions/4129229/rails-restoring-contents-of-non-model-form-that-uses- form-tag/24974457 # 24974457 –

Répondre

32

Vous aurez besoin FormHelper méthodes:

que vous voulez une simple action test qui soumet à l'action do_test:

Une simple vue d'une action de test (messages/test.html.erb):

<% form_tag '/posts/do_test' do %> 
    <%=label_tag 'name' %> 
    <%=text_field_tag 'name'%> 

    <%=label_tag 'phone' %> 
    <%=text_field_tag 'phone'%> 

    <div><%= submit_tag 'Save' %></div> 
<% end -%> 

Dans le contrôleur messages:

def test 
end 

def do_test 
    name = params[:name] 
    phone = params[:phone] 
    # do whatever you want... 
end 

Aussi, vous devez ajouter ces 2 actions aux routes dans config/routes.rb

map.resources :posts, :collection=>{:test => :get, :do_test => :post} 
+0

semble bon, je vais essayer cela ... – conspirisi

0

Avez-vous pensé à utiliser un présentateur?

http://blog.jayfields.com/2007/03/rails-presenter-pattern.html

+0

merci, mais ça a l'air hardcore, je ne suis qu'un débutant, je pourrais essayer ça si je deviens un ninja rails. – conspirisi

+0

Un présentateur est en fait un très bon modèle à suivre pour représenter des formes qui ne sont pas directement liées à un modèle, même pour un débutant. – yagooar

5

Si vous créez une classe pour représenter votre objet (Appelons ContactInfo) vous pouvez définir des méthodes de cette classe, puis Utilisez-les en utilisant les aides standard du constructeur de formulaire Rails.

class ContactInfo 
    attr_accessor :name, :company, :email, :phone, :comments 

    def initialize(hsh = {}) 
    hsh.each do |key, value| 
     self.send(:"#{key}=", value) 
    end 
    end 
end 

Et dans votre forme:

<h2>Contact Us</h2> 
<% form_for(@contact_info, :url => path_for_your_controller_that_handles_this, :html => {:method => :post}) do |f| %> 

    <%= f.label :name %> 
    <%= f.text_field :name %> 

    ... 
<% end %> 

Jusqu'à présent, qui se soucie non? Cependant, ajoutez validatable gem, et vous avez une vraie raison pour ce faire! Vous pouvez maintenant avoir des messages de validation comme un vrai modèle.

Vérifiez ma rempli de classe ContactInfo:

class ContactInfo 
    include Validatable 

    attr_accessor :name, :company, :email, :phone, :comments 

    validates_presence_of :name 
    validates_presence_of :email 
    validates_presence_of :phone 

    def initialize(hsh = {}) 
    hsh.each do |key, value| 
     self.send(:"#{key}=", value) 
    end 
    end 
end 

J'aime parce que vous pouvez écrire votre contrôleur beaucoup même comme un objet ActiveRecord et ne pas avoir à muss il avec beaucoup de logique lorsque vous avez besoin pour ré-afficher le formulaire. De plus, si vous utilisez Formtastic ou un autre constructeur de formulaire personnalisé, vous pouvez utiliser cet objet avec lui, en gardant facilement vos styles de formulaire existants.

+0

merci, je vais vérifier cela, bientôt ... – conspirisi

Questions connexes