如何在 rails url 中隐藏 :id?

How to hide :id in rails url?

我有这些嵌套路由,我想从 url.

中隐藏 id 参数
resources :shares, only: [:index, :create, :update] do 
  resource :wizard, path: "trade" do
    get :first_object
    get :second_object
    get :confirmation
    post :validate_step
  end
end

每个页面都有一个 form_for,在顶部看起来像这样:

<%= form_for [@object, @trade_wizard], as: :trade_wizard, url: validate_step_share_wizard_path(@object) do |f| %>

因此用户将 first_object 添加到向导,并被重定向到以下 url:/shares/113/trade/second_object。添加 second_object 后(这与第一个明显不同),用户被重定向到 /shares/106/trade/confirmation。我不确定这是否代表潜在的安全违规行为,而且我的测试似乎工作正常,所以我认为如果我找到某种方法来隐藏 url 的 id 部分应该没问题?

或者我的嵌套路由用例不正确?

gem 'friendly_id' 让您可以创建漂亮的 URL 并使用人性化的字符串,就像它们是数字 ID 一样。

https://github.com/norman/friendly_id

您有一组可能的解决方案:

  1. 如前所述,您可以将 ID 转换为 slug 之类的东西,这就是另一个答案提到的:https://github.com/norman/friendly_id

  2. 您可以将所选对象的 ID 存储在会话 cookie 中。这样,客户端仍然在发送相关数据,但它并没有真正出现在 URL.

  3. 你可以有一个临时的 Transaction table,你可以在其中存储第一个对象和第二个对象。这样,路由将处理 transaction_id,而 first_object_id 和 second_object_id 将在 table 中抽象出来。这也将允许您存储与交易或交易过程相关的其他元数据。

  4. 您可以创建一个不与 shares 控制器链接的单独端点,您可以在其中接受两个(可选)查询参数:/sharetransaction/trade?first_object_id=113&second_object_id=106。这样,URL 反映了实际发生的情况,而不是无缘无故地在中间更改 ID。

您采用的方法取决于您的用例。