如何在Rails中的表单外显示错误

时间:2014-09-29 14:11:08

标签: ruby-on-rails error-handling

我想在我创建的视图/方法中显示错误消息。问题是我在模型中添加了错误,如下面的代码所示:

errors.add :base, 'It can't be destroyed because some users use it'

但是在我尝试渲染时,视图中没有显示错误。

我复制了表单的错误渲染机制。 我是否必须制作表格或类似内容以显示错误消息?

4 个答案:

答案 0 :(得分:0)

您可以使用flash功能进行错误。当您的控制器收到模型中的错误时,请执行以下操作:

redirect_to show_url(@post), alert: "It can't be destroyed because some users use it"

答案 1 :(得分:0)

发生验证错误时,您应该能够在视图模板中的任何位置添加错误消息。它看起来像这样:

<% if @post.errors.any? %>
  <div id="error_explanation">
    <h2><%= pluralize(@post.errors.count, "error") %> prohibited this post from being saved:</h2>

    <ul>
    <% @post.errors.full_messages.each do |msg| %>
      <li><%= msg %></li>
    <% end %>
    </ul>
  </div>
<% end %>

来源:http://guides.rubyonrails.org/active_record_validations.html#working-with-validation-errors

答案 2 :(得分:0)

确保两件事:

  1. 您在视图模板中有以下块:

    <%= @posts.errors.full_message.each |key, value| %> 
      # display value
    <% end %>
    
  2. 在控制器中分配错误消息:

    redirect_to posts_path, flash[:alert] = "It can't be destroyed because some users use it"
    

答案 3 :(得分:0)

假设您正在更新 Dogs index 视图中的单条狗,当您需要在没有 Javascript 和表单外快速显示验证错误时,解决方案是将错误数组(如单个错误)发送到错误部分布局并遍历它们。

请注意,此方法不是常规方法,并且有一些缺点。您需要从控制器redirect_to,因为render won't work well,因此您将刷新页面并向上冒泡(传播)到顶部。

# dogs_controller.rb
class DogsController
  def index
    @dogs = Dog.all
  end

  def update
    if dog.update
      # ...
    else
      flash[:danger] = dog.errors.full_messages
      redirect_to dogs_path
    end
  end
end
# app/views/layouts/_errors.html.haml
- flash.each do |message_type, message|
  - if message.is_a?(Array)
    # show validation errors outside of form workaround
    - message.each do |msg|
      .alert.alert-danger= msg
  - else
    # usual error handler (from controller flash)
    = content_tag(:div, message, class: "alert alert-#{message_type}")