0

可能重复:
Ruby on Rails 回调,:before_save 和:before_create 有什么区别?

我希望将 Ruby on Rails 的当前 ID 从 /1、/2、/3 等替换为随机生成的 URL,例如 /csd8dsv68dvs。

在研究创建它之后,我在帖子模型中发现了这个

before_create { self.code = SecureRandom.hex(5) }

before_create 做什么以及如何实现随机 id?

更新

看来我弄错了一部分。我不想更改 ID,我只想将 URL 更改为用户无法猜测的随机字符串。

4

3 回答 3

3

一个伟大的宝石可以帮助您: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您的资源的路由方法在哪里。

于 2012-12-05T21:46:07.010 回答
2

强烈建议不要替换 Rails id,但如果您的意思是要将 URL 更改为更不可预测的内容,那么您就在正确的道路上。

这是一个与通过创建“漂亮 URL”解决的问题非常相似的问题,该问题已经解决了很多次,例如使用Friendly ID gem。也许您会想要分叉 gem 并将其称为“不友好的 ID”:-)

无论 gem 是否开箱即用,方法都很简单——阅读代码并向编写它的人学习!

于 2012-12-05T21:48:40.217 回答
0

我同意另外两张海报;您可能不想这样做,FriendlyID 提供了一种使用备用 ID 记录记录的好方法。也就是说,如果你真的想替换 id,你可以改变它:

thing = Thing.new
thing.id = some_random_number_generator()
thing.save!

这已经在 ActiveRecord 中的 Overriding id on create 中进行了介绍。认真考虑不要这样做,除非你有充分的理由。

于 2012-12-05T21:55:16.797 回答