2014-01-28 58 views
0

P.S:我一直在使用Ruby不到48小时,所以期待我是愚蠢的!验证消息帮助程序或检索验证错误

我已经建立了验证模型,所有工作正常。不过,我想修改由唯一性约束返回的消息。该消息需要通过执行一些额外处理的方法返回。

因此,例如,如果我尝试创建“名称”属性设置为“bob”,并且bob命名帐户已存在的新用户模型,我想显示一条消息,如“Bob不可用,点击这里查看当前鲍勃的账户“。

因此,辅助方法将查找当前的bob帐户,获取本地化的字符串,并执行本地化字符串的常见字符串放置,将名称,链接到帐户以及我想要的任何其他信息放入邮件中。

从本质上讲,我想是这样的:

validates_uniqueness_of :text, :message => self.uniquefound() 

def uniquefound() 
    return "some string i can make up myself with #{self.name}'s info in it" 
end 

毫无疑问,这是完全错误的......

如果这是不可能的,我已经找到了我可以使用users.errors.added?如果name属性检测有一个独特的错误添加,从那里我可以做一些散列操作来删除唯一的错误,并把我自己在那里要么在“after_validation”回调或在控制器...还没有制定出如何做那是,但这是我的后备计划。

那么,有没有为消息提供类方法回调的方法,或者将当前模型传递给该方法(如果它是一个静态方法),或者在该方法内调用它以使该方法成为待验证的模型。

更新

通过轨道源代码拖网,我发现增加错误的错误类

private 
    def normalize_message(attribute, message, options) 
     case message 
     when Symbol 
     generate_message(attribute, message, options.except(*CALLBACKS_OPTIONS)) 
     when Proc 
     message.call 
     else 
     message 
     end 
    end 
    end 

所以在这个被称为私有方法,如果我传递的方法作为消息,我认为这个方法是用来调用我的函数/方法并获取返回数据。然而,它似乎没有在当前对象的范围内调用,也没有通过错误所属的对象...

所以,如果我的挖掘是在正确的路径上,似乎调用一个方法对消息的当前对象,或者调用传递对象的静态方法是不可能的。

回答

2

如果你真的需要这个功能,你可以这样做。

Class User < ActiveRecord::Base 
    include Rails.application.routes.url_helpers 
    .... 
    validate :unique_name 


    def unique_name 
    original_user = User.where("LOWER(name) = ?", name.downcase) 
    if original_user 
     message = "#{name} is not available " 
     message << ActionController::Base.helpers.link_to("Click Here",user_path(original_user)) 
     message << "to view the current #{name}'s account." 
     errors.add(:name,message) 
    end 
    end 
end 

编辑

有一个Proc对象,而不是

Class User < ActiveRecord::Base 
    include Rails.application.routes.url_helpers 
    .... 
    validates_uniqueness_of :name, message: Proc.new{|error,attributes| User.non_unique(attributes[:value]) } 


    def self.non_unique(name) 
    original_user = User.where("LOWER(name) = ? ", name.downcase) 
    message = "#{name} is not available " 
    message << ActionController::Base.helpers.link_to("Click Here",Rails.application.routes.url_helpers.user_path(original_user)) 
    message << "to view the current #{name}'s account." 
    end 
end 

这些都将增加以下错误消息:命名

"Name Bob is not available <a href=\"https://stackoverflow.com/users/10\">Click Here</a>to view the current Bob's account." 
+0

是的,我没看可能性做我自己独特的验证,然后让我做wh atever我喜欢这个消息。猜猜我希望有更像回调的东西。目前试图查看是否可以在消息中找到':taken'消息,并在'after_validation'期间替换它,但由于消息散列只是readbale,我必须使用类提供的任何方法。这可能意味着抓取属性的整个错误数组,找到并删除与“:taken”相匹配的值,然后插入一个新值 – Lee

+0

好吧,它具有相同的确切效果,但我为Proc对象添加了一个方法,适合你的需求以及更接近你原来的问题 – engineersmnky

+0

哈我想它确实有同样的效果,因为它仍然需要查询原始帐户。但奇怪的是,对于消息来说,使用回调函数更合适,因为那是我想要修改的,而不是完全自己处理唯一的约束(而不是它结束了任何不同,所以也许我只是愚蠢)。无论如何,感谢您的帮助!猜猜我会开始搜索并找出两个参数指定的位置,因为我无法在rails源中找到任何指示,其中属性传递给回调函数。 – Lee