目前,我的应用程序包含以下代码 ,以便在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
答案 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_for
和f.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表” 结束 端
这完美无缺!现在我能够正确地收到错误通知:)