Rails:多个(上下文相关的)验证错误消息

时间:2011-04-23 21:14:37

标签: ruby-on-rails validation

首先,我是Rails的新手,所以我很抱歉,如果这个问题有明显的答案 - 我花了几个小时搜索,还没有找到一个,但也许我只是不知道如何用它表示谷歌。

这是:我有一个现有的Rails(2.3.5)应用程序与通常的HTML界面。我被要求使用此应用程序的一个子集,并将其用作API。我磕磕绊绊的地方是尝试提供备用模型验证错误消息。当人类用户尝试注册新帐户并且他的用户名太短时,验证消息应为“请输入有效的用户名”,例如,当有人尝试通过API注册新帐户时,相同的问题应触发消息“USERNAME_TOO_SHORT”。

理想情况下,我想扩展验证框架,以便我可以在我的用户模型中执行类似的操作:

validates_length_of       :user_name, :minimum => 6,
:message => 'Please enter a valid username',
:api_message => 'USERNAME_TOO_SHORT',

...然后选择在视图或控制器中使用API​​的api_message。

我考虑过的其他事情包括:

  
      
  • 向我的用户模型添加“is_using_api”变量,并根据此变量的值适当地构建错误消息。不过,我真的不想以这种方式污染模型。   
  • 查看视图或控制器中的user.errors对象,并使用映射翻译“请输入有效的用户名” - > “USERNAME_TOO_SHORT”(例如)。这很脆弱,并且会破坏产品经理要求更改HTML错误消息的时间。   

在Rails中有没有比我上面概述的更好的方法?如果没有,是否有人就是否/如何实现我概述的路径有任何建议?

2 个答案:

答案 0 :(得分:0)

这可以通过利用“respond_to”块

来实现
respond_to do |format|
  format.html {
    ... the response for HTML (i.e. browser clients) ...
  }
  format.xml {
    ... the response for API clients
  }
  format.myformat {
    ... your custom format - you can literally name it anything you want
  }
end

它旨在根据人们用于请求您的信息的格式来自定义响应。上面只是一个例子,但通常如果你要构建一个API,你将不会回复HTML,因为那时客户端可能不得不解析一堆与它们无关的标签(例如标签,等)。

您不必使用XML - 您可以使用任何格式(JSON,XML,甚至您自己的自定义格式)。

检查你的“routes.rb”文件,你会明白我的意思。路由可以包含:格式符号,这是告诉控制器所请求的格式。这就是控制器如何知道要执行的代码块。

另外,如果你去here并搜索“:format”,我也会帮忙。

答案 1 :(得分:0)

以下是您所说的方式:

  1. 理想情况下,我想扩展验证框架,添加:api_message => 'USERNAME_TOO_SHORT', ...然后选择在API的视图或控制器中使用api_message。

  2. 在我的用户模型中添加“is_using_api”变量,并根据此变量的值适当地构建错误消息。不过,我真的不想以这种方式污染模型。

  3. 查看视图或控制器中的user.errors对象,并使用映射翻译“请输入有效的用户名” - > “USERNAME_TOO_SHORT”(例如)。这很脆弱,并且会破坏产品经理要求更改HTML错误消息的时间。
  4. 以上所有内容都不够好,或说好软件设计的不良实践 我建议:

    1. 制作一个YAML文件,其中包含您要在API中更改的所有错误,并将它们存储在适当的层次结构中。这样,如果有任何变化,它不会损坏整个系统,并且所需的更改将是最小的。您可以通过从yml文件中调用它来调用apt错误或警告消息(不要忘记在开头要求该文件)。
    2. 浏览此链接,看看它是否有帮助link