gpt4 book ai didi

ruby-on-rails - 验证消息助手或检索验证错误

转载 作者:太空宇宙 更新时间:2023-11-03 18:19:02 25 4
gpt4 key购买 nike

P.S:我使用 Ruby 的时间还不到 48 小时,所以希望我是个笨蛋!

我已经在一个模型上设置了验证,一切正常。但是我想修改由唯一性约束返回的消息。该消息需要通过执行一些额外处理的方法返回。

例如,如果我尝试创建一个新的用户模型,其中“name”属性设置为“bob”,并且名为 account 的 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? 来检测名称属性是否添加了唯一错误,从那里我可能可以做一些散列删除唯一错误的操作,并将我自己的错误放在“after_validation”回调或 Controller 中......还没有确切地知道如何做到这一点,但这是我的后备计划。

那么,有没有办法为消息提供类方法回调,并将当前模型传递给该方法(如果它是静态方法)或在该方法中调用它 self是正在验证的模型。

更新

通过 rails 源代码,我发现了这个在向错误类添加错误时调用的私有(private)方法

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

因此,如果我将方法作为消息传递,我假定此方法用于调用我的函数/方法并获取返回数据。然而,它似乎没有在当前对象的范围内调用,也没有传入错误所属的对象......

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

最佳答案

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

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

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

关于ruby-on-rails - 验证消息助手或检索验证错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21415272/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com