2011-11-23 109 views
0

我有一個User模型女巫我已覆蓋to_param方法。User.find忽略方法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

我已經嘗試過after_save過濾器,但是我不能在那裏改變屬性。

我如何根據他的ID爲用戶創建一個唯一的ID?

回答

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

+0

我試過這個,但是在我的控制器中返回這個錯誤:'''undefined method' from_param'for#'' –

+1

對不起,我的錯誤:'from_param'應該是一個類方法。我更新了代碼。 –

+0

它的工作......謝謝 –