2010-01-18 119 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