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

Ami*_*Pal 5 ruby controller views ruby-on-rails

我是新手,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>
.....
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

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

提前致谢

Bur*_*rak 8

关键是您正在使用模型表单,该表单显示ActiveRecord模型实例的属性.控制器创建操作将负责一些验证(并且您可以添加更多验证).

new当模型无法保存时,控制器重新呈现View

如下更改您的控制器:

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
Run Code Online (Sandbox Code Playgroud)

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

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

然后在您的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 %>
Run Code Online (Sandbox Code Playgroud)

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

<% if @simulation.errors.any? %>
  <%= @simulation.errors.full_messages %>
<% end %>
Run Code Online (Sandbox Code Playgroud)