如何通过表单提交数据后防止重定向

时间:2015-09-05 00:04:24

标签: ruby-on-rails forms redirect routes actionmailer

rails的新手(作为一个整体编程),我对路由有点困惑。

我的视图中有一个表格可以收集某人的电子邮件,然后在他们点击提交后再发送电子邮件。它可以工作,但在我点击提交后,我被重定向到我正在呼叫的方法的视图,以便邮寄表格。我不想被重定向,我想留在同一页面上。我尝试过使用POST和PUT,但都重定向了我。我的控制器使用不正确吗?

我的控制器有这种方法:

  def mail
   recipient_email = params[:email]
   itinerary_body = params[:body]
   x = ItineraryMailer.itinerary("#{recipient_email}", "#{itinerary_body}")
   x.deliver
  end

以下是我认为的表格:

  <%= form_tag({controller: "bookings", action: "mail"}, method: "post") do %>
     <%= text_field_tag(:email) %>
     <%= text_field_tag(:body) %>
  <%= submit_tag("Email Me!") %>

我的路线:

match '/bookings', to: 'bookings#mail', via: 'post'

谢谢!

1 个答案:

答案 0 :(得分:2)

由于您的redirect_to操作中没有mail,因此Rails不会将您重定向到任何地方。相反,它只是试图直接渲染该动作的视图。但是,我猜测那不是你要渲染的视图。

所以,不是试图阻止重定向(无论如何都不会发生),我建议你采取相反的方法:使用重定向来获得正确的视图。在mail操作结束时,请执行以下操作:

redirect_to action: :original_action_name

其中:original_action_name是为您提供所需视图的操作的名称。

您还可以使用评论中建议的render 'action',但这可能会导致当前操作可能未加载的某些情况下出现问题,或者设置您要渲染的视图所需的所有内容。当然,你可以在当前动作中进行加载/设置,但是你在两个不干的地方做同样的事情。