用户可编辑的to_param值

时间:2010-01-18 10:29:18

标签: ruby-on-rails

我有一个模型,它有一个覆盖to_param方法,返回记录的(唯一)名称。这很好用,但有一点需要注意 - 用户可以编辑名称。

如果我的记录#1的名称=“abc”并且记录#2的名称=“xyz”,则用户编辑记录#2并将名称更改为“abc”将在保存为validates_uniqueness_of约束时出错被侵犯了。但是当Rails再次构造edit.html.erb页面时,它会使用未经验证的数据 - 包括to_param,现在将所有内容链接到记录#1(“abc”)。因此,随后的保存记录#1而非记录#2。

什么是建议的最佳做法,以防止这种可怕的结果?我应该在重定向错误之前重置名称值(但是如果名称没问题且错误在其他地方怎么办)或者我应该更改我的视图以手动插入id而不是使用Rails的自动化?

1 个答案:

答案 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