2009-12-14 2 views
4

J'ai essayé de créer une page de confirmation de commande pour mon application rails, et je ne suis pas tout à fait sûr de la façon de le faire d'une manière reposante.Page de confirmation de commande dans les rails

Il y avait quelques réponses sur this question qui m'a eu à mi-chemin, mais le problème était que je ne savais pas trop comment configurer le formulaire dans la vue des rails de sorte qu'il conduirait l'utilisateur à une page de confirmation avec tous leurs détails au lieu d'une action de création.

En ce moment, mon avis est simple:

 <% form_for :order do |f| %> 
     <%= f.error_messages %> 
     <p> 
     <%= f.label :first_name %><br /> 
     <%= f.text_field :first_name, :size => 15 %> 
     </p> 
     <p> 
     <%= f.label :last_name %><br /> 
     <%= f.text_field :last_name, :size => 15 %> 
     </p> 
     (Be sure to enter your name as it appears on your card) 
     <p> 
     <%= f.label :card_type %><br /> 
     <%= f.select :card_type, [["Visa", "visa"], ["MasterCard", "master"], ["Discover", "discover"], ["American Express", "american_express"]] %> 
     </p> 
     <p> 
     <%= f.label :card_number %><br /> 
     <%= f.text_field :card_number %> 
     </p> 
     <p> 
     <%= f.label :card_verification, "Card Verification Value (CVV)" %><br /> 
     <%= f.text_field :card_verification, :size => 3 %> 
     </p> 
     <p> 
     <%= f.label :card_expires_on %><br /> 
     <%= f.date_select :card_expires_on, :discard_day => true, :start_year => Date.today.year, :end_year => (Date.today.year+10), :add_month_numbers => true %> 
     </p> 
    <p><%= f.submit "Submit" %></p> 

Quelles sont les choses dois-je faire pour diriger l'utilisateur vers une page de confirmation qui affiche tous les détails de la commande?

Merci!

Kenji

Répondre

10

Il y avait quelques réponses sur cette question qui m'a à mi-chemin, mais le problème était que je n'étais pas tout à fait sûr comment mettre en place la forme les rails vue afin qu'il prendrait l'utilisateur à une page de confirmation avec tous leurs détails au lieu d'une action créer .

Diriger un formulaire vers une page non standard est assez simple.

Ajoutez une option d'URL form_for. tel que

<% form_for :order do |f| %> 

devient

<% form_for :order :url => {:action => "confirm"} do |f| %> 

Vous aurez besoin de cageot l'action de confirmation dans vos itinéraires, mais cela implique que ceci:

map.resources :orders, :collection => {:confirm => :get} 

Tout ce que vous avez besoin est maintenant un action de base du contrôleur et une vue:

def confirm 
    @order = Order.new(params[:order]) 
    unless @order.valid? 
    render :action => :new 
    else  
    end 
end 

Votre vue devrait être presque identique à celle de l'affichage, avec l'ajout d'un formulaire soumettant @order à l'action de création.

+0

Cela fonctionne presque. Le problème semble être le numéro de carte de crédit et la date d'expiration. Ces numéros ne sont pas stockés dans l'objet de commande et sont envoyés directement à la passerelle de paiement. Dans le modèle j'ai ceci: attr_accessor: card_number,: card_verification Ces attributs ne semblaient pas être ramassés sur la page de confirmation lorsque je clique sur submit. –

+0

S'ils sont définis comme attr \ _accessors sur Order. Ils devraient être disponibles dans la vue de confirmation. – EmFi

+0

Cela semble fonctionner si j'ai un autre formulaire qui semble identique à celui de la "nouvelle" action, mais dans ce cas, je voudrais simplement afficher le texte avec les informations de commande avec un lien vers "Modifier cette commande" pour aller retour à la nouvelle action. –

2

Pourquoi ne pas vous tirez la confirmation par ajax, par exemple, tirer le résultat et le mettre comme div overlay, lors de la confirmation présenter les valeurs d'origine sous la forme.

Si vous avez encore besoin de le faire à votre guise, vérifiez wizardly, il est exactement conçu pour de telles utilisations.

+0

Merci. On dirait que l'ajax est probablement le chemin à parcourir. Je vais devoir étudier ça. –

0

Je voudrais mettre à jour la réponse pour des Rails plus élégants 4 ou plus. J'espère que cela aidera les débutants comme moi. Ruby est génial! :)

routes.rb

resources :orders do 
    collection do 
    post 'confirm' 
    end 
end 

orders_controller.rb

def confirm 
    @order = Order.new(order_params) # GET THE POST parameters 
    render :new if @order.invalid? # Return if false 
end 

form.html.erb

<%= form_for @order, url: {action: 'confirm'} do |f| %> 
Questions connexes