Rails在表单上显示验证消息

时间:2017-04-01 14:40:41

标签: ruby-on-rails

我正在尝试验证data belongs_to模型的project模型。验证有效,因为如果验证失败,则不会保存数据。

但是,我无法通过data验证来显示新表单上验证的正确错误消息。

如何在data表单上显示正确的错误验证消息?

表单网址 http://localhost:9080/projects/7/data/new

数据模型:

class Datum < ApplicationRecord
  belongs_to :project
  validates :supplier, :item, :presence => true #need this to display error message on data form
end

项目模型:

class Project < ApplicationRecord
  belongs_to :user
  validates :name,:presence => true #works perfectly, displays error message on project form
  has_many :data, dependent: :destroy
  accepts_nested_attributes_for :data
end

数据控制器

def create
  @datum = Datum.new(datum_params)
  @datum.project_id = params[:project_id]

  respond_to do |format|
    if @datum.save
      format.html { redirect_to project_data_path, notice: 'Created.' }
    else
      format.html {#do I need something here to redisplay the form with the errors }
    end
  end
end

数据表格

<%= bootstrap_form_for([@project, @project.data.build]) do |f| %>
  <div class="field">
    <%= f.text_field :supplier %>
  </div>

  <div class="field">
    <%= f.text_field :item %>
  </div>

  <div class="actions">
    <%= f.submit %>
  </div>
<% end %>

修改 我得到的最接近的解决方案是,如果对象没有保存:

format.html { redirect_to new_project_datum_path, alert: @datum.errors }

但这并不是我所需要的。因为它只返回错误消息msg和空字段,所以用户必须再次填写所有字段。 出于某种原因,重定向有效,但render 'new'不起作用。

1 个答案:

答案 0 :(得分:2)

你应该呈现新的&#39;保存失败时的操作:

def create
  @project = Project.find(params[:project_id])
  @datum = @project.build(datum_params)

  respond_to do |format|
    if @datum.save
      format.html { redirect_to project_data_path, notice: 'Created.' }
    else
      format.html { render action: 'new' }
    end
  end
end

此外,您应该更改表单以使用@datum实例变量,而不是在表单中构建它:

<%= bootstrap_form_for([@project, @datum]) do |f| %>

和控制器:

def new
  @project = Project.find(params[:project_id])
  @datum = @project.data.build
end

基本思想是,如果用户到达新页面,则创建一个新的空基准实例变量。用户填写表单并将其发布到创建操作。如果在create操作中保存失败,则保留已填写的@datum对象并将其呈现回表单。 @datum对象将显示错误(可以通过@ datum.errors检查),您可以向用户显示错误。