我有一个模型,它有一个覆盖to_param方法,返回记录的(唯一)名称。这很好用,但有一点需要注意 - 用户可以编辑名称。
如果我的记录#1的名称=“abc”并且记录#2的名称=“xyz”,则用户编辑记录#2并将名称更改为“abc”将在保存为validates_uniqueness_of约束时出错被侵犯了。但是当Rails再次构造edit.html.erb页面时,它会使用未经验证的数据 - 包括to_param,现在将所有内容链接到记录#1(“abc”)。因此,随后的保存记录#1而非记录#2。
什么是建议的最佳做法,以防止这种可怕的结果?我应该在重定向错误之前重置名称值(但是如果名称没问题且错误在其他地方怎么办)或者我应该更改我的视图以手动插入id而不是使用Rails的自动化?
答案 0 :(得分: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