0

整个代码来自这个问题: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 

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

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

你能帮我吗 ?谢谢!

更新:

耙路线

     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"} 
4

2 回答 2

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.new) 。new这样,您可以对新建和编辑操作使用相同的表单。

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

于 2012-08-20T18:37:00.620 回答
0
render "/other_model/show"

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

于 2012-08-20T18:36:45.443 回答