User.find忽略方法to_param

时间:2011-11-23 16:37:15

标签: activerecord model ruby-on-rails-3.1 rails-3.1

我有一个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?

1 个答案:

答案 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方法的更多信息。