2010-04-04 71 views
0

我有一個static_controller是負責在站點中的所有靜態頁面和作品中的routes.rb如下:在Rails中路由靜態控制器的最佳方式是什麼?

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 

的問題是,是的,當我重定向到我關於網頁表單的error_messages就丟失了(因爲表單的error_messages只存在一個請求,並且該請求在重定向時結束)。 我會如何去保存error_messages,並將用戶連接回靜態url? 會話/閃存是否足夠(如果是這樣,我將使用什麼代碼來傳遞錯誤消息),還是我對整個事情做錯了?

謝謝!

回答

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 
+0

但後來我仍然在'/ contacts'而不是'/ about' - 正是我想避免的。這也不是很RESTful。有什麼建議麼? – 2010-04-04 01:13:39

+0

是的,你會留在/聯繫人,這是一個POST。這是確保您的錯誤得到顯示的標準方法。 – 2010-04-04 01:34:02

+0

如果聯繫人保存,您可以執行「redirect_to:action =>'about'」。如果保存失敗,則使用渲染。請記住,如果您要求新的連接(使用重定向),@errors將不存在。 我不是一位REST專家,但該代碼在大多數Rails應用程序中都非常標準。我的(可能有缺陷的)理解是,REST中的重要部分是您正在處理HTTP方法中的信息,而不是URL中的信息。什麼特別似乎不可靠? – mikewilliamson 2010-04-04 01:57:55

相關問題