可能重复:
Ruby on Rails Callback, what is difference between :before_save and :before_create?
我希望将Ruby on Rails当前id从/ 1,/ 2,/ 3等替换为随机生成的URL,例如/ csd8dsv68dvs。
在研究创建之后,我在帖子模型中找到了这个
before_create { self.code = SecureRandom.hex(5) }
before_create做了什么以及如何实现随机ID?
似乎我错了一部分。我不打算更改ID,我只是想将URL更改为用户无法猜测的随机字符串。
答案 0 :(得分:3)
作为通过路线的标识符 friendly_id ,帮助您选择资源:id
的替代方案的绝佳宝石。它上面甚至还有 a RailsCast 。
before_create
是一个 ActiveRecord callback ,在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
是您资源的路由方法。
答案 1 :(得分:2)
我强烈建议不要替换Rails id,但如果你想将URL改为不太可预测的东西,那么你就是在正确的道路上。
这是一个非常类似的问题,通过创建已经多次解决的“漂亮网址”解决了这个问题,例如使用Friendly ID gem。也许你想要分叉宝石并称之为“不友好的ID”: - )
宝石是否开箱即用,方法很简单 - 阅读代码并向编写代码的人学习!
答案 2 :(得分:0)
我同意其他两张海报;你可能不想这样做,而FriendlyID提供了一种很好的方法来处理记录的备用ID。也就是说,如果你确实想要替换id,你可以改变它:
thing = Thing.new
thing.id = some_random_number_generator()
thing.save!
Overriding id on create in ActiveRecord已经涵盖了这一点。除非你有充分的理由,否则认真考虑不要这样做。