我正在尝试验证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'
不起作用。
答案 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检查),您可以向用户显示错误。