Skip to main content
 首页 » 编程设计

ruby-on-rails中验证错误消息未显示在表单 View 中

2025年05月04日46开发

我有一个简单的模型:

class Property < ApplicationRecord 
 belongs_to :user 
 has_many :invoices, dependent: :destroy 
 has_many :tenants, dependent: :destroy 
 
 validates :street, presence: true, length: { maximum: 50} 
 validates :city, presence: true, length: { maximum: 50} 
 validates :zip, presence: true, length: { maximum: 10} 
 validates :rent, presence: true, length: { maximum: 50} 
 
 
 def receivable 
  (self.rent.to_i + self.charges.to_i) 
  end 
end 

在控制台中尝试时,验证错误按预期出现:

[2] pry(main)> prop = Property.new(street:"zzz") 
 => #<Property:0x007fb99cde1cc0 id: nil, number: nil, streetype: nil, street:  
 "zzz", city: nil, zip: nil, rent: nil, charges: nil, user_id: nil, created_at:  
 nil, updated_at: nil> 
 
[3] pry(main)> prop.save 
(0.3ms)  BEGIN 
(0.8ms)  ROLLBACK 
=> false 
 
[4] pry(main)> prop.errors.full_messages 
=> ["User must exist", "City can't be blank", "Zip can't be blank", "Rent can't  
be blank"] 

这是 Controller :

def new 
 @user =  current_user 
 @property = @user.properties.build 
end 
 
def create 
 @user =  current_user 
 @property = @user.properties.create(property_params) 
 @property.user_id = current_user.id 
  if @property.save 
   flash[:notice] = "Nouveau Bien créé !" 
   redirect_to user_properties_path 
  else 
   redirect_to new_user_property_path 
 end 
end 

这是表单 View :

<div class="container center"> 
 <div class="row white"> 
  <div"> 
   <h2>Nouveau bien</h2> 
   <%= simple_form_for([@user, @property]) do |j| %> 
    <%= j.input :number, label:"Numéro" %> 
    <%= j.input :streetype, label: "Laisser vide si nécessaire", collection: ["  
    ","rue","boulevard","allée"] , prompt: "Choisir" %> 
    <%= j.input :street, label:"Nom" %> 
    <%= j.input :city, label:"Commune / Ville" %> 
    <%= j.input :zip, label:"Code Postal" %> 
    <%= j.input :rent, label:"Montant du Loyer" %> 
    <%= j.input :charges, label:"Montant des charges" %> 
    <br> 
    <%= j.submit 'Créer', class: "form-control btn btn-info" %> 
   <% end %> 
  </div> 
 </div> 
</div> 

当故意省略其中一个字段时, Controller 会重定向到正确的表单 viw,但不会出现验证错误消息。他们曾经出现过,但由于某种原因消失了。

知道为什么吗?

谢谢!

请您参考如下方法:

而不是else block 中的redirect_to new_user_property_path,您应该

render 'new' 

原因:redirect 指示浏览器发出新请求,因此您最终会丢失 @property 对象的上下文及其错误。它实际上向 new 操作发出了新的请求。 render 将继续当前操作(在本例中为 create),并使用 @property< 在 new View 中渲染响应、错误和之前的表单正文。