2010-01-18 30 views
0

我有一個模型,它具有返回記錄的(唯一)名稱的覆蓋to_param方法。這工作得很好,但有一個警告 - 用戶可以編輯名稱。用戶可編輯的to_param值

如果我有記錄#1名=「ABC」和記錄#2名=「XYZ」,然後在用戶編輯記錄#2和更改名稱爲「ABC」將在保存作爲validates_uniqueness_of得到一個錯誤約束被違反。但是,當Rails再次構造edit.html.erb頁面時,它會使用未經驗證的數據 - 包括to_param,它現在將所有內容鏈接到記錄#1(「abc」)。因此,節省的存款因此在記錄#1而不是記錄#2上行動。

什麼是建議的最佳實踐,以防止這種可怕的結果?我應該在重定向一個錯誤之前重置名稱值(但是如果名稱正確並且錯誤位於其他地方),還是應該更改我的視圖以手動插入id而不是使用Rails自動處理?

回答

3

可能最簡單的做法是不依賴於name屬性,而是依賴於用戶隱藏的另一個屬性。

例如。如果您在模型上有固定鏈接:字符串列,則可以執行類似操作:

Class ModelName < ActiveRecord::Base 

    before_save :update_permalink 

    validates_presence_of :name  

    def to_param 
    permalink 
    end 

    private 
    def update_permalink 
    self.permalink = name.parameterize 
    end 
end