2010-12-28 14 views
2

注文には多くの州があります。私はそれらの名前付きルートを作成したいと思います。私は状態をパラメータとしてコントローラに渡す必要があります。ここで私が考えていたことはありますが、明らかに機能しません。Railsルーティング変数

match "order/:state/:id" => "orders#%{state}", as: "%{state}" 

したがって、order/address/17はorders#addressにルーティングします。stateと:idはparamsとして渡されます。同様に、order/shipping/17はorders#shippingにもルーティングされます:stateと:idは渡されます。

ここにコントローラがあります。ここで

class OrdersController < ApplicationController 

    before_filter :load_order, only: [:address, :shipping, :confirmation, :receipt] 
    before_filter :validate_state, only: [:address, :shipping, :confirmation, :receipt] 


    def address 
    @order.build_billing_address unless @order.billing_address 
    @order.build_shipping_address unless @order.shipping_address 
    end 


    def shipping 
    @shipping_rates = @order.calculate_shipping_rates 
    end 


    def confirmation 

    end 


    def receipt 

    end 

    private 

    def load_order 
    @order = Order.find(params[:id]) 
    end 

    # Check to see if the user is on the correct action 
    def validate_state 
    if params[:state] 
     unless params[:state] == @order.state 
     redirect_to eval("#{@order.state}_path(:#{@order.state},#{@order.id})") 
     return 
     end 
    end 
    end 

end 

私たちは一緒に行くことになったものです:あなたはするつもりはありません

routes.rbを

%w(address shipping confirmation receipt).each do |state| 
    match "order/#{state}/:id", :to => "orders##{state}", :as => state, :state => state 
end 

orders_controller.rb

def validate_state 
    if params[:state] 
     unless params[:state] == @order.state 
     redirect_to(eval("#{@order.state}_path(@order)")) 
     return 
     end 
    end 
    end 
+0

あなたのURLが「/ order/address/17」の場合、状態情報はどこから取得されますか?これが意図されたURLでない場合、それは何ですか? –

+0

私はちょうど私がやっていることのもう少しを示すためにそれを編集しました。 –

答えて

6

dを作ることができるその種の構文を持つ名前付きルートを指定していますが、基本的には:actionとして:stateを使用しています。 :state:actionに置き換え、コントローラーを手動で指定すると、正常に動作します。明らかに、params[:state]ではなくparams[:action]を参照するようにコードを変更する必要があります(またはその変数をbefore_filterにマップします)が、それ以上の場合は正常に動作するはずです。

match "order/:action/:id", :controller => "orders" 

注文がcreateまたはdeleteのようなRESTfulなリソースのマッピングを持っている場合、このルートが悪いと思われる、それらにGETリクエストを可能にすることに注意してください。完了したいそれぞれのアクションに対して明示的なルートを追加したいだけかもしれません。 params[:state]も得られます:

%w(address shipping).each do |state| 
    match "order/#{state}/:id", :to => "orders##{state}", :as => state, :state => state 
end 
+0

これは素晴らしい応答です。その2番目の部分をありがとう、私たちがそれを実装した方法に大きな違いをもたらしました。 –

関連する問題