如何在rails视图上显示错误消息?

时间:2015-06-27 19:46:46

标签: ruby-on-rails ruby controller views

我是rails的新手,想要在form字段上应用验证。

myviewsnew.html.erb

<%= form_for :simulation, url: simulations_path do |f|  %>

<div class="form-group">
  <%= f.label :Row %>
  <div class="row">
    <div class="col-sm-2">
      <%= f.text_field :row, class: 'form-control' %>
    </div>
  </div>
</div>
.....

Simulation.rb

class Simulation < ActiveRecord::Base
 belongs_to :user
 validates :row, :inclusion => { :in => 1..25, :message => 'The row must be between 1 and 25' }
end

simulation_controller.rb

class SimulationsController < ApplicationController

  def index
    @simulations = Simulation.all
  end

  def new
  end

  def create
    @simulation = Simulation.new(simulation_params)
    @simulation.save
    redirect_to @simulation
  end

  private
   def simulation_params
   params.require(:simulation).permit(:row)
  end

我想检查模型类中row字段的整数范围,如果它不在范围内,则返回错误消息。我可以从上面的代码检查范围但不能返回错误消息

提前致谢

3 个答案:

答案 0 :(得分:8)

关键是您正在使用模型表单,该表单显示ActiveRecord模型实例的属性。 create action of the controller会处理一些验证(您可以add more validation)。

控制器重新渲染new查看模型何时无法保存

更改您的控制器如下:

def new
  @simulation = Simulation.new
end

def create
  @simulation = Simulation.new(simulation_params)
  if @simulation.save
    redirect_to action: 'index'
  else
    render 'new'
  end
end

当模型实例无法保存(@simulation.save返回false)时,将重新呈现new视图。

new视图显示无法保存的模型的错误消息

然后在new视图中,如果存在错误,您可以将其打印出来,如下所示。

<%= form_for @simulation, as: :simulation, url: simulations_path do |f|  %>
  <% if @simulation.errors.any? %>
    <% @simulation.errors.full_messages.each do |message| %>
      <li><%= message %></li>
    <% end %>
  <% end %>
  <div class="form-group">
    <%= f.label :Row %>
    <div class="row">
      <div class="col-sm-2">
        <%= f.text_field :row, class: 'form-control' %>
      </div>
    </div>
  </div>
<% end %>

这里的重要部分是你要检查模型实例是否有任何错误,然后将它们打印出来:

<% if @simulation.errors.any? %>
  <%= @simulation.errors.full_messages %>
<% end %>

答案 1 :(得分:2)

这样做 -

 <%= form_for :simulation, url: simulations_path do |f|  %>
    <% if f.object.errors.any? %>
      <ul>
        <% if f.object.errors.each do |message| %>
          <li><%= message %></li>
        <% end %>
      </ul>
    <% end %>

   ..........
 <% end %> 

答案 2 :(得分:-2)

您只需将此代码添加到视图文件(myviewsnew.html.erb):

<%= error_messages_for :simulation %>

检查http://apidock.com/rails/ActionView/Helpers/ActiveRecordHelper/error_messages_for

error_messages_for的完整语法