【问题标题】:before_create - Ruby on Rails [duplicate]before_create - Ruby on Rails [重复]
【发布时间】:2012-11-23 20:31:22
【问题描述】:

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

【问题讨论】:

标签: ruby-on-rails ruby


【解决方案1】:

friendly_id 是一个伟大的宝石,可以帮助您找到资源 :id 的替代品,因为通过路线的标识符是 friendly_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 是资源的路由方法。

【讨论】:

  • 伙计,你打字比我快:-)
  • 别忘了索引code
  • 我必须在视图中添加什么?
  • 我的回答已经告诉你放置视图需要什么:路径到资源的路径方法,指定:code 属性。如果您像大家建议的那样使用 friendly_id,则通常不需要指定 :code
【解决方案2】:

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

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

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

【讨论】:

  • 我尝试了友好 ID gem,尽管它并没有真正的帮助。我明白你的意思,虽然这个应用程序允许用户私下创建东西,但我希望 URL 是随机的,以阻止用户猜测 URL。
  • 我不确定为什么 gem 没有帮助。我理解目标 - 这是完全合理的,但您为 URL 中使用的字段提供的值完全取决于您 - SecureRandom 很好。
  • 我刚刚更新了问题。
【解决方案3】:

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

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

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

【讨论】:

  • 原因是因为这个应用程序用户创建私人文档,所以我宁愿如果 URL 是随机的,以阻止用户猜测 URL,即使我要让它让其他用户可以'看不到文件。
  • 所以要强调的是,您不需要需要更改实际的 id,只需更改 URL。更改 ID 将是一个巨大(而且完全没有必要)的痛苦。
  • 是的,我会在这里使用 FriendlyID(或任何其他生成备用 ID 的方法),然后完全删除基于 ID 查找的路由,或者仅依靠用户身份验证来防止查看基于 ID。通过默默无闻的安全性在这里没有用处。自动递增 ID 不包含任何信息,您需要在控制器中阻止对它们的访问。
  • 啊,是的,我只是想更改 URL。
  • 我刚刚更新了问题。
猜你喜欢
  • 2011-09-30
  • 2012-04-04
  • 2012-07-05
  • 1970-01-01
  • 2014-11-04
  • 2014-01-08
  • 2013-02-18
  • 2019-01-27
  • 2014-12-20
相关资源
最近更新 更多