Rails 3.2中模型的错误消息

时间:2013-05-15 06:16:33

标签: ruby-on-rails-3

目前,我的应用程序包含以下代码 ,以便在model.rb 的视图上显示错误消息,但由于error_messages_for已弃用,因此未更新代码在Rails 3.任何人都可以建议我如何在Rails 3中做同样的事情?我希望逻辑在model.rb文件中,从那里我应该能够在视图上显示错误信息

excel_file.rb(model.rb)

#jus some sample function
def show_error(test_file)
    if test_file == 'Upload Test Case'
      errors[:base] << "Please upload excel sheet with testsuite config sheet and testcases" 
    elsif test_file == 'Upload Test Data'
      errors[:base] << "Please upload excel sheet with test data" 
    end
  end

sampleview.html.erb

 #some code..
   <span class='error'><%= error_messages_for (@excel_file) %></span>
     #some code..

application_helper.rb

def error_messages_for(*objects)
  html = ""
  objects = objects.map {|o| o.is_a?(String) ? instance_variable_get("@#{o}") : o}.compact
  errors = objects.map {|o| o.errors.full_messages}.flatten
  if errors.any?
    html << "<div id='errorExplanation'><ul>\n"
    errors.each do |error|
      html << "<li>#{h error}</li>\n"
    end
    html << "</ul></div>\n"
  end
  html.html_safe
end

2 个答案:

答案 0 :(得分:2)

您可以使用https://github.com/rails/dynamic_form

它提供了您想要的功能。

<强>更新

你是对的,这不符合Rails 3。

你应该做这样的事情:

创建共享部分

<强> /app/views/shared/_error_messages.html.erb

<% if target.errors.any? %>  
<div id="errorExplanation">  
  <h2><%= pluralize(target.errors.count, "error") %> prohibited this record from being saved:</h2>  
  <ul>  
  <% target.errors.full_messages.each do |msg| %>  
    <li><%= msg %></li>  
  <% end %>  
  </ul>  
</div>  
<% end %>

并称之为:

<%= render "shared/error_messages", :target => @excel_file %>

那么为什么删除方法error_messages_forf.error_messages?瑞安贝茨说:

  

删除这些方法的原因是错误消息的显示通常需要自定义,并且通过旧方法执行此操作有点麻烦,并且没有像我们所拥有的错误消息HTML内联那样灵活现在。将HTML交给视图意味着我们可以根据需要更改错误消息的显示。

来源:http://asciicasts.com/episodes/211-validations-in-rails-3

更新2

这适用于自定义验证

validate :show_error

def show_error
  if test_file == 'Upload Test Case'
    errors[:base] << "Please upload excel sheet with testsuite config sheet and testcases" 
  elsif test_file == 'Upload Test Data'
    errors[:base] << "Please upload excel sheet with test data" 
  end
end

答案 1 :(得分:0)

<强>解决方案:

创建共享部分

应用程序/视图/普通/ _error_messages.html.erb:

<% if target.errors.any? %>  
<div id="errorExplanation">  
  <h2><%= pluralize(target.errors.count, "error") %> prohibited this record from being saved:</h2>  
  <ul>  
  <% target.errors.full_messages.each do |msg| %>  
    <li><%= msg %></li>  
  <% end %>  
  </ul>  
</div>  
<% end %>

并像这样调用:(在sampleview.html.erb中)

<% if @excel_file %>
    <%= render "common/error_messages", :target => @excel_file %>
<% end %>

设置if条件以避免错误NoMethodError:target.errors.any中的未定义方法'errors'。这样可以避免页面抛出此错误,并仅在存在目标(@excel_file)实例时呈现局部视图。

这适用于自定义验证

app / model中的excel_file.rb(model.erb):

def show_error   如果test_file =='上传测试用例'     errors [:base]&lt;&lt; “请上传带有testsuite配置表和测试用例的excel表”   elsif test_file =='上传测试数据'     errors [:base]&lt;&lt; “请上传包含测试数据的excel表”   结束 端

这完美无缺!现在我能够正确地收到错误通知:)