我有一个模型PhotoAlbum。
我希望Rails在创建时可以神奇地为PhotoAlbum创建一个UID。最好是一个非常长的数字/字母数字UID,好像坏人有这个UID,他们可以做坏事。
建议:
由于
答案 0 :(得分:3)
Rails默认为您处理数据库ID。
你真的不应该默默无闻地使用安全性 - 你应该使用插件来处理身份验证和授权,然后即使他们知道ID,坏人也无法做任何事情。
答案 1 :(得分:2)
简单的十六进制密钥怎么样?只需将伪随机数据和模型数据组合起来并将其输入hexdigest即可获得一个相当独特的密钥,一个简单的检查可以确保它真的是唯一的。
class Album
before_create :set_uid
protected
def set_uid
# This only works before_create obviously, otherwise it would
# find itself and loop eternally.
while self.uid.blank? or !Album.find_by_uid(self.uid).blank?
self.uid = Digest::SHA1.hexdigest("--#{self.title}--#{Time.current.usec}--")
end
end
end
你可以稍微清理一下,但它应该有用。
至于在架构中这样做,我猜这取决于你使用的数据库引擎,我不是那里的专家;)
答案 2 :(得分:0)
如何使用after_initialize钩子?
我正在假设您不希望UUID作为主键(否则事情会更复杂)。为了你的目的,我会避免这种情况。
不幸的是,我没有经过测试就完成了所有这些工作,所以我无法100%确定我没有做过任何拼写错误。如果您遇到任何问题,请随时给我发消息。
首先,您需要在项目中添加uuidtools。假设有rails 2,这是在config / environment.rb
中Rails::Initializer.run do |config|
..
# You can try a later uuidtools version, but this is the one I've worked with
config.gem "uuidtools", :version => '2.1.1'
..
end
添加完上述内容后,请运行“sudo rake gems:install”,然后下载并安装gem。
然后,在您的模型中,添加以下代码:
validates_length_of :uuid, :is => 36 # Untested.. makes sense to me though
def after_initialize
self.uuid ||= UUIDTools::UUID.random_create.to_s
end
在您创建表格的迁移中:
create table :photo_albums do |t|
..
t.string :id, :limit => 36
..
end
我希望有所帮助。
奥斯卡