0

我有一个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并搜索 id 而不采取-usr

我已经尝试了 after_save 过滤器,但我可以在那里更改属性。

如何根据用户的 id 为用户创建唯一的 id?

4

1 回答 1

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

于 2011-11-23T19:43:49.527 回答