Заказы могут иметь много состояний. Я хотел бы создать именованные маршруты для тех. Мне нужно, чтобы состояние передавалось контроллеру в качестве параметра. Вот о чем я думал, но это, очевидно, не работает.
match "order/:state/:id" => "orders#%{state}", as: "%{state}"
Так что я бы хотел, чтобы order / address / 17 направлялся на адреса order # с параметрами: state и: id, передаваемыми в качестве параметров. Аналогично, order / shipping / 17 будет перенаправлять на заказы # 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