将错误消息从一个控制器传递到另一个控制器

时间:2011-01-05 12:28:32

标签: ruby-on-rails

我的网站上有联系表格。它工作正常,这是代码:

class ContactsController < ApplicationController
  def new
    @contact = Contact.new(:id => 1)
  end

  def create
    @contact = Contact.new(params[:contact])
    if @contact.save
      redirect_to('/', :notice => "Message sent ....")
    else
      flash.now[:error] = "Oops, something went wrong. Please try again"
      render 'new'
    end
  end
end

#contact
  = simple_form_for @contact, :url=>{:controller=>:contacts, :action=>:create}, :html=>{:method=>:post} do |f|
    = render 'shared/error_messages', :target => @contact
    = f.input  :name
    = f.input  :email
    = f.input  :subject
    = f.input  :body, :as => :text, :input_html => { :rows => 5 }
    = f.submit "Send"

我已决定要将联系表单嵌入我的主页pages/index.html.haml

所以我将表单粘贴在我的主页底部的部分链接中,并将一个实例变量添加到我的页面控制器中的索引操作中。如果我正确填写表格,电子邮件将被发送,一切都很棒。

但是如果表单提交失败,那么当我真的更喜欢pages_controller的:index动作时,来自contacts_controller的:new动作会被渲染。我知道我可以使用redirect_to "/"重定向到此操作,但是当我这样做时,我没有在表单上获得error_messages。

如何将控制权从contacts_controller转移到pages_controller并在失败的表单提交中包含错误消息?

1 个答案:

答案 0 :(得分:1)

如果无法在创建操作中创建正确的页面,但是如果要重定向,则不知道如何分支代码,那么你不想要flash.now。

基本上

if @contact.save
  redirect_to('/', :notice => "Message sent ....")
else
  if (should new page be shown check)
    flash.now[:error] = "Oops, something went wrong. Please try again"
    render 'new'
  else
    flash[:error] = "Oops ... "
    redirect_to somelocation_path
  end
end