我对rails非常陌生,我想知道最好的方法是:
我有一个控制器在数据库中创建记录。
如果发生特定的验证错误,我想设置一个标志,我看不出用我熟悉的rails模式来实现这个目标的好方法。
我想要检测的模型验证是:
validates_uniqueness_of :title
我的控制器正在执行此操作:
fcs = Entity.create(:title => text)
当上述错误失败时,我有一个ActiveModel错误集合可供使用。
我应该如何可靠地设置一个标志,以编程方式指示标题已被拍摄?
到目前为止,我已经考虑了
fcs.errors.messages.has_key?(:title)
但如果由于其他原因导致冠军失败,这将返回true。所以我需要更多的东西:
fcs.errors.messages[:title]==["has already been taken"]
但这可能是一个维护问题,并且也会被不同的语言环境打破......
所以有人知道如何使用RoR完成这项工作吗?
感谢您的任何建议
编辑:建议标志“is_title_duplicated”的示例用法:
if(! fcs.errors.empty?)
json['success']=false
json['errors']=fcs.errors.full_messages
json['title_was_duplicate'] = is_title_duplicated
render :json => json
...
答案 0 :(得分:2)
我建议在模型类中添加一个方法来检测唯一性。
class Entity < ActiveRecord::Base
def unique_title?
Entity.where(:title => title).count > 0
end
end
当然,这意味着您要运行该查询两次(一次针对validates_uniqueness_of
,一次针对unique_title?
)。只要性能可以接受,我更喜欢可读性而不是性能。如果性能不可接受,您仍然可以选择。您可以在自己的自定义验证中重复使用unique_title?
并缓存结果。
class Entity < ActiveRecord::Base
validate :title_must_be_unique
def unique_title?
# you may want to unset @unique_title when title changes
if @unique_title.nil?
@unique_title = Entity.where(:title => title).count > 0
end
@unique_title
end
private
def title_must_be_unique
unless unique_title?
errors.add(:title, I18n.t("whatever-the-key-is-for-uniqueness-errors"))
end
end
end
答案 1 :(得分:1)
你的意思是在唱片上设置一个标志?每当验证失败时,记录都不会保存到数据库
如果您只是设置错误消息,则不必。 Rails会自动将fsc.erros设置为类似{:title =&gt;的哈希值。 “标题已被采用”}。您可以通过将:message传递给验证来指定该消息。
此外,您可以使用l18n将消息国际化。只需编辑yaml文件,如下所述: http://guides.rubyonrails.org/i18n.html#configure-the-i18n-module