【问题标题】:User.find is ignoring method to_paramUser.find 忽略方法 to_param
【发布时间】:2011-11-23 16:37:14
【问题描述】:

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

【问题讨论】:

    标签: activerecord model ruby-on-rails-3.1 rails-3.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_paramdocs。描述和示例中明确说明该方法用于生成url,但开发者负责通过该参数查找对应的记录。

    关于字符串格式,您可以在文档中找到有关String#% 方法和它使用的Kernel#format 方法的更多信息。

    【讨论】:

    • ive tried this, but in my controler is returning this error: ``undefined method from_param' for #<0x00000102b63bd8>
    猜你喜欢
    • 1970-01-01
    • 2016-12-01
    • 1970-01-01
    • 2016-04-18
    • 2015-07-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-02
    • 2022-11-11
    相关资源
    最近更新 更多