在Rails中路由静态控制器的最佳方法是什么?

时间:2010-04-04 00:22:14

标签: ruby-on-rails session routes contact-form

我有一个static_controller负责站点中的所有静态页面,并在routes.rb中按如下方式工作:

map.connect ':id', :controller => 'static', :action => 'show'

我有一个静态页面,其中包含一个联系表单。 我目前有一个contacts_controller,负责将联系信息插入数据库。 在我的routes.rb文件中,我有:

map.resources :contacts

我的联系表格(简化)如下:

<% form_for @contact do |f| %>
    <p class="errors"><%= f.error_messages %></p>  

    <p>
        <%= f.label :first_name %>
        <%= f.text_field :first_name %>
    </p>


    <p class="buttons"><%= f.submit %></p>
<% end %>

反过来提交我的contacts_controller的创建动作。 我的创建动作如下所示:

def create
    @contact = Contact.new(params[:contact])
    if @contact.save
      flash[:notice] = "Email delivered successfully."
    end
    redirect_to "about"
end

问题是,当我重定向回到我的about页面时,表单的error_messages会丢失(因为表单的error_messages仅存在于一个请求中,并且该请求在重定向时结束)。 我将如何保留error_messages并仍然将用户链接回about静态网址? 会话/闪存是否足够(如果是这样,我将使用什么代码传递错误消息)或者我是否认为这一切都错了?

谢谢!

1 个答案:

答案 0 :(得分:2)

我认为可能会发生的是你需要渲染而不是重定向。 重定向终止请求,并告诉客户端向另一个地址发出新请求。这将失去你的错误。 如果您的保存尝试失败,您希望通过再次显示错误来完成请求,并显示错误。

def create
@contact = Contact.new(params[:contact])
if @contact.save
  flash[:notice] = "Email delivered successfully."
  redirect_to @contact #make a new request for the address of the new record or some other address if you want
else
  render :action => "new" #complete the request by rendering the new action with the @contact variable that was just created (including the @errors).
end