before_create - Ruby on Rails

时间:2012-12-05 21:41:41

标签: ruby-on-rails ruby

  

可能重复:
  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更改为用户无法猜测的随机字符串。

3 个答案:

答案 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已经涵盖了这一点。除非你有充分的理由,否则认真考虑不要这样做。