我有一个User
模型,我已经覆盖了to_param
方法。
class User < ActiveRecord::Base
def to_param
if self.id < 100
if self.id < 10
s = "00#{self.id}"
else
s = "0#{self.id}"
end
else
s = "#{self.id}"
end
return "usr-#{s}"
end
end
在我的控制器上:
user = User.find(params[:id])
@title = user.name
问题是......我不能让任何用户......
如果我将to_param
方法更改为:return "#{s}-usr"
,则只需忽略-usr
并在不-usr
的情况下搜索ID
我已经尝试了一个after_save过滤器,但我无法在那里更改一个属性。
如何根据用户ID为用户创建唯一ID?
答案 0 :(得分:1)
Rails不会为你做逆变换,你必须自己做。我想你可以这样做:
class User < ActiveRecord::Base
# Returns formatted user id:
#
# 1 => 'usr-001'
# 11 => 'usr-011'
# 111 => 'usr-111'
# 1111 => 'usr-1111'
#
def to_param
"usr-%03d" % id
end
def self.from_param(param)
# ruby strips leading zeros for us (e.g., '012'.to_i returns 12)
# but we need to remove 'usr-' prefix first
find(param[4..-1].to_i)
end
end
然后在任何需要的地方使用它:
user = User.from_param params[:id]
此外,请查看to_param
docs。描述和示例明确指出此方法用于生成URL,但开发人员负责通过此参数查找相应的记录。
关于字符串格式,您可以在文档中找到有关String#%
方法及其使用的Kernel#format
方法的更多信息。