简短的问题...
如何在验证或保存之前编辑传递给模型的属性?
长问题...
在我的应用程序中,我有一个唯一编号生成器,以便可以在随机生成的唯一编号上对条目进行索引,这样用户就无法找到该条目(换句话说,使用 ID 的替代方法,用户可以随机猜测)。
所以在我的模型中,我有......
def self.generate_photo_number
record = Object.new
while record
random = rand(9223372036854775806)
record = Photo.first(:conditions => ["unique_photo_no = ?", random])
end
return random
end
在我的表格中,我有输入......
<%= hidden_field(:photo, :unique_photo_no, value: Photo.generate_photo_number) %>
i.e.
<input id="photo_unique_photo_no" name="photo[unique_photo_no]" type="hidden" value="233720368547758" />
问题是,如果用户提交表单,按下后退按钮,更改选项并再次提交,rails 应用程序将找到具有相同条目的条目unique_photo_no
并导致保存错误。
我可以创建一个 JavaScript 函数,在单击提交时生成一个数字(我已经为 Rails 应用程序环境之外的页面完成了此操作),但该generate_photo_number
函数的美妙之处在于它会检查以确保它不存在 - 而 JavaScript 确实不是。
如何在验证之前生成数字并将其保存在unique_photo_no
属性中?
这就是我迄今为止在我的照片模型中放置的内容......
before_validation :generate_photo_number
validates_uniqueness_of :unique_photo_no,
:message => " - is already in use."
def self.generate_photo_number
record = Object.new
while record
random = rand(9223372036854775806)
record = Photo.first(:conditions => ["unique_photo_no = ?", random])
end
@photo.unique_photo_no = random
end