为使用令牌而不是ID的方法设置路由?

时间:2019-01-09 02:35:05

标签: ruby-on-rails ruby

问题:对于未登录的用户,他们无权访问其“订单显示”页面。因此,我在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替代的情况下,使用诸如:

之类的URL。
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替代项。

2 个答案:

答案 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替代项。

相关问题