模型名称出现在我的验证错误中 - rails

时间:2014-09-25 10:17:20

标签: ruby-on-rails ruby validation activerecord ruby-on-rails-4

我仍然在努力让我的验证错误消息显示而没有出现在其中的模型名称,我有一个名为 AnimalImage 的嵌套模型,我正在对文件是否有验证已经提交。

def limit_num_of_images
  if image.size < 1
    errors.add(:base, "Please add an image")
     ap(errors.inspect)
  end
end

我在这个例子中得到的错误是

Animal images base Please add an image

我要展示的只是

Please add an image

在控制台中查看errors.inspect的输出是

"#<ActiveModel::Errors:0x007fa0192d1890 @base=#<AnimalImage id: nil, animal_id: nil, image: nil, created_at: nil, updated_at: nil>, @messages={:base=>[\"Please add an image\"]}>"

所以消息是哈希的吗?如果是这种情况我需要找到一种不显示密钥的方法吗?

最后在我看来,我输出的错误消息是这样的

<% @animal.errors.full_messages.each do |msg| %>
  <li><%= msg %></li>
<% end %>

所以作为一个快速修复我创建了一个帮助器,只是删除了文本的第一部分,但这感觉太hacky我想知道如何正确使用Rails

def error_edit(message)
  msg = message
  msg.gsub('Animal images base', ' ')
end

// View
<% @animal.errors.full_messages.each do |msg| %>
  <li><%= error_edit(msg) %></li>
<% end %>

2 个答案:

答案 0 :(得分:2)

我的控制器遇到了同样的问题。我知道这不是一个更好的解决方案,但我相信它会给你一个想法。

请不要使用

errors.add(:base, "Please add an image")

用户

errors.add(:attribute, "Please add an image")

<% @animal.errors.each do |key,value| %>
  <li><%= "#{key.to_s.titleize} #{value}".html_safe %></li>
<% end %>

答案 1 :(得分:1)

我认为这对你有用

class Animal < ActiveRecord::Base
  validate do |animal|
    animal.errors[:base] << "Please add an image" if animal.image.size < 1
  end
end

我还建议您查看此链接http://api.rubyonrails.org/classes/ActiveModel/Errors.html#method-i-add

在属性上的错误消息中添加消息。

你正在做的是在名为base的属性上添加消息,这显然不是你想拥有的

更新:从rails 3中删除了add_to_base方法。您应该使用错误[:base]&lt;&lt; &#34;错误&#34;代替。