Rails嵌套表单error_messages不显示

时间:2012-08-20 18:31:55

标签: ruby-on-rails validation

整个代码来自这个问题:Nested form validations not working in rails app

验证有效,但现在问题出在error_message上。它根本就没有出现。

我发现由于我的控制器中的redirect_to,它无法正常工作:

class MessagesController < ApplicationController

  def create
    @trip = Trip.find(params[:trip_id])
    @message = @trip.messages.create(params[:message])     
  if @trip.messages.create
    MessageMailer.send_message(@message).deliver
    redirect_to thank_you_path        
  else    
    redirect_to trip_path(@trip)
  end
 end
end 

我必须使用渲染。但问题是如何?

此消息表单位于另一个模型显示页面内,如果消息未通过验证,我想在同一个显示页面中看到错误消息。

你能帮帮忙吗? 谢谢!

更新

rake routes

     messages GET    /messages(.:format)                         {:action=>"
 index", :controller=>"messages"}
             POST   /messages(.:format)                         {:action=>"
 create", :controller=>"messages"}
  new_message GET    /messages/new(.:format)                     {:action=>"
 new", :controller=>"messages"}
  edit_message GET    /messages/:id/edit(.:format)                {:action=>"
 edit", :controller=>"messages"}
     message GET    /messages/:id(.:format)                     {:action=>"
 show", :controller=>"messages"}
              PUT    /messages/:id(.:format)                     {:action=>"
 update", :controller=>"messages"}
              DELETE /messages/:id(.:format)                     {:action=>"
 destroy", :controller=>"messages"}
 trip_messages GET    /trips/:trip_id/messages(.:format)          {:action=>"
 index", :controller=>"messages"}
              POST   /trips/:trip_id/messages(.:format)          {:action=>"
 create", :controller=>"messages"}
 new_trip_message GET    /trips/:trip_id/messages/new(.:format)      {:action=>"
 new", :controller=>"messages"}
 edit_trip_message GET    /trips/:trip_id/messages/:id/edit(.:format) {:action=>"
 edit", :controller=>"messages"}
 trip_message GET    /trips/:trip_id/messages/:id(.:format)      {:action=>"
 show", :controller=>"messages"}
              PUT    /trips/:trip_id/messages/:id(.:format)      {:action=>"
 update", :controller=>"messages"}
              DELETE /trips/:trip_id/messages/:id(.:format)      {:action=>"
 destroy", :controller=>"messages"} 

2 个答案:

答案 0 :(得分:1)

class MessagesController < ApplicationController

     def create
         @trip = Trip.find(params[:trip_id])
         @message = @trip.messages.build(params[:message])     
         if @message.save
              MessageMailer.send_message(@message).deliver
              redirect_to thank_you_path        
         else    
              render "edit"
         end
     end
end

然后,您应该在_edit.html.erb中有一个名为views/messages的部分内容,其中包含您的表单以及用于呈现错误的代码。

您的edit.html.erb可能就像render "edit"


快速评论:

你应该改变这个:

form_for([@trip, @trip.messages.build])

form_for([@trip, @message])

并在@message操作中设置@message = @message.newnew)。这样,您可以使用相同的表单进行新操作和编辑操作。

您还可以考虑使用像simple_form这样的宝石,这样可以更轻松地创建表单,并且内联显示错误。

答案 1 :(得分:0)

render "/other_model/show"

渲染会保留当前的实例变量,因此如果“if”语句失败,验证将加载带有错误的@trip变量,并将反映在新渲染的表单中。