【问题标题】:Look Up Post Without Using Primary Key不使用主键查找帖子
【发布时间】:2012-03-01 13:20:16
【问题描述】:

要在我的控制器中获取某个帖子,您可以在 URL 中输入类似这样的内容

http://0.0.0.0:3000/post/1
http://0.0.0.0:3000/post/2
http://0.0.0.0:3000/post/3

我被要求制作它,以便无法以这种方式获取它,而是使用随机字符串。例如更像这样的东西:

http://0.0.0.0:3000/post/wr4t-d2e2-1ee3
http://0.0.0.0:3000/post/prst-3r4t-1r1r
http://0.0.0.0:3000/post/asdo-2e12-sxas

问题 为了做到这一点,我应该在帖子表中创建另一个名为“token”或“random”的列,并通过 find_by 使用该列来获取帖子吗?即 Post.find_by_token('wr4t-d2e2-1ee3')

关于如何处理此问题的正确方法的任何意见。 我一直在阅读应用程序将使用 '代理键''guid''自然键'令牌的示例随机

我只是对最佳实践有点不知所措。

【问题讨论】:

  • 我认为对于使用什么的最佳实践没有明确的答案。就我个人而言,我会寻找与您所服务的内容相关的内容:UPC、Isbn、带下划线的博客文章标题等。重要的是索引该列。其他人做有效的事。
  • 让我猜,你有一个多租户系统,不希望用户看到其他租户通过 id 发布的帖子
  • 是的,客户不希望帖子如此易于访问和可预测。 (即 1、2、3、4、5)按逻辑顺序排列。
  • 如果是多租户,仅更改 URL 不应让任何随机人员访问其他租户的数据。 (如果它是多租户的,那么标记它。多租户数据库可能很棘手。)

标签: ruby-on-rails model-view-controller database-design primary-key


【解决方案1】:

你要找的是这个:

   class Post < ActiveRecord::Base
     # Permalinks
     #-----------------------------------------------------------------------------
     def to_param
        "#{post.token}"
     end
   end

网址将生成为

post_url(@post)
#http://0.0.0.0:3000/post/wr4t-d2e2-1ee3

那你就照常做吧

Post.find(params[:id])

您可以通过使用 before_validation 回调来生成您的令牌。

您可以使用 gem 并使用 friendly_id 为您处理此问题,并跟踪生成的 slug 的历史记录。 Tho,听起来这可能对您的要求有点过头了。

【讨论】:

    【解决方案2】:

    您可能需要检查friendly_id gem。 https://github.com/norman/friendly_id.

    RailsCast:http://railscasts.com/episodes/314-pretty-urls-with-friendlyid

    您将需要一个 token 列,如果您使用的是 Devise,则可以使用 Devise.friendly_token 方法生成该列。

    【讨论】:

    • 我认为这颗宝石会有所帮助。谢谢。
    猜你喜欢
    • 2016-01-11
    • 2021-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多