问题:对于未登录的用户,他们无权访问其“订单显示”页面。因此,我在OrdersController中创建了一个订单确认方法,如下所示:
def order_confirmation
@order = Order.find_by(order_token: params[:order_token])
end
现在,如您所见,我当前正在使用order_token
覆盖的find_by
to_param
。
我想避免使用覆盖,因为它适用于整个控制器,而且我还没有想出一种不只将其用于一种方法的方法。如您在此处看到的那样,这弄乱了我的关联模型:Why is my :order_token being passed as my :order_id when submitting a form file?
我如何做到这一点:
resources :orders do
get 'order_confirmation', :on => :member
end
在不使用to_param
替代的情况下,使用诸如:
example.com/orders/:order_token/order_confirmation
?
更新和可能的答案:
在进一步测试之后,我将给出答案。
使用时:
resources :orders, param: :order_token do
get 'order_confirmation', :on => :member
end
在我的路线中,我可以转到所需的URL。尽管在创建订单后,它仍然使用:id将我定向到一条路线。
然后我将重定向更改为:
redirect_to order_confirmation_order_path(@order.order_token)
它有效。
我还删除了to_param
替代项。
答案 0 :(得分:0)
简而言之,您需要resources :orders, param: :order_token
,然后在您的订单模型中
class Order < ApplicationRecord
def to_param
order_token
end
end
这将在整个应用程序中产生副作用。
铁路指南中有关于Overriding Named Route Parameters的更多信息
答案 1 :(得分:0)
使用时:
resources :orders, param: :order_token do
get 'order_confirmation', :on => :member
end
在我的路线中,我可以转到所需的URL。尽管在创建订单后,它仍然使用:id将我定向到一条路线。
然后我将重定向更改为:
redirect_to order_confirmation_order_path(@order.order_token)
而且有效。
我还删除了to_param
替代项。