我希望将 Ruby on Rails 的当前 ID 从 /1、/2、/3 等替换为随机生成的 URL,例如 /csd8dsv68dvs。
在研究创建它之后,我在帖子模型中发现了这个
before_create { self.code = SecureRandom.hex(5) }
before_create 做什么以及如何实现随机 id?
更新
看来我弄错了一部分。我不想更改 ID,我只想将 URL 更改为用户无法猜测的随机字符串。
我希望将 Ruby on Rails 的当前 ID 从 /1、/2、/3 等替换为随机生成的 URL,例如 /csd8dsv68dvs。
在研究创建它之后,我在帖子模型中发现了这个
before_create { self.code = SecureRandom.hex(5) }
before_create 做什么以及如何实现随机 id?
看来我弄错了一部分。我不想更改 ID,我只想将 URL 更改为用户无法猜测的随机字符串。
一个伟大的宝石可以帮助您:id
通过路线作为标识符的资源替代品是friendly_id。上面甚至还有一个 RailsCast。
before_create
是一个ActiveRecord 回调,在 SO(正如其他人评论的那样)和 API 中都有很好的解释。
如果您选择使用原始
before_create { self.code = SecureRandom.hex(5) }
您可以修改控制器操作以使用此代码而不是 id 来查找资源。
def some_action
@resource = ModelClass.find_by_code!(params[:id])
end
您将:code
属性传递给视图中资源的路由
resource_path(@resource.code)
resource_path
您的资源的路由方法在哪里。
我强烈建议不要替换 Rails id,但如果您的意思是要将 URL 更改为更不可预测的内容,那么您就在正确的道路上。
这是一个与通过创建“漂亮 URL”解决的问题非常相似的问题,该问题已经解决了很多次,例如使用Friendly ID gem。也许您会想要分叉 gem 并将其称为“不友好的 ID”:-)
无论 gem 是否开箱即用,方法都很简单——阅读代码并向编写它的人学习!
我同意另外两张海报;您可能不想这样做,FriendlyID 提供了一种使用备用 ID 记录记录的好方法。也就是说,如果你真的想替换 id,你可以改变它:
thing = Thing.new
thing.id = some_random_number_generator()
thing.save!
这已经在 ActiveRecord 中的 Overriding id on create 中进行了介绍。认真考虑不要这样做,除非你有充分的理由。