【问题标题】:How to hide :id in rails url?如何在rails url中隐藏:id?
【发布时间】:2018-10-24 00:51:39
【问题描述】:

我有这些嵌套路由,我想从 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 添加到向导中,并被重定向到以下网址:/shares/113/trade/second_object。添加second_object(与第一个明显不同)后,用户被重定向到/shares/106/trade/confirmation。我不确定这是否代表潜在的安全违规,而且我的测试似乎工作得很好,所以我想如果我找到某种方法来隐藏 url 的 id 部分应该没问题?

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

【问题讨论】:

标签: ruby-on-rails ruby rails-routing


【解决方案1】:

你有一套可能的解决方案:

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

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

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

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

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

【讨论】:

  • 谢谢!实际上我没有考虑这部分(因为它感觉无关紧要),但我实际上将相关的 ID 存储在会话变量中。整个事情是在一个多步骤表单向导中构建的,然后只有在所有内容都成功添加后才会传播到 db。我仍然对如何从 url 隐藏 ID 感到困惑。我不需要在表单中传递 ID 吗?
  • 我还是有点困惑。 first_objectsecond_object 都是用户从相似对象列表中挑选出来的,如果不将它们作为参数传递给 form_for,我就无法将它们传递给会话。如何在控制器中分配它们?
【解决方案2】:

gem 'friendly_id' 可让您创建漂亮的 URL 并使用对人类友好的字符串,就好像它们是数字 ID。

https://github.com/norman/friendly_id

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-04-12
    • 2021-01-06
    • 1970-01-01
    • 2012-08-15
    • 1970-01-01
    • 2021-10-31
    • 2018-07-08
    相关资源
    最近更新 更多