2010-12-04 58 views
1

我正在使用AuthLogic在我的Rails應用程序中對用戶進行身份驗證。該部分正確設置並正確工作。如何在Rails中重新呈現操作時在頁面URL中維護相同的控制器和操作?

我有以下途徑定義:

map.login '/account/login', :controller => :user_sessions, :action => :new 

調用耙路線返回我的期望:

login /account/login {:controller=>"user_sessions", :action=>"new"} 

當有人提出一個登錄,它調用UserSessionsController.create:

def create 
    @user_session = UserSession.new(params[:user_session]) 
    if @user_session.save 
     flash[:notice] = "Login successful!" 
     redirect_back_or_default account_url 
    else 
     render :action => :new 
    end 
end 

如果@ user_session.save失敗,則適當的錯誤消息出現在sc穎。但是,瀏覽器URL也會更改爲「http:// localhost:3000/user_session」,而不是停留在「http:// localhost:3000/account/login」上。

我認爲問題是我正在給渲染方法。我應該喂什麼?

回答

0

進一步挖掘後,我發現在另外的StackOverflow問題的解決方案:Use custom route upon model validation failure

我只是修改了我的路線,以增加對冒充爲「/帳號/登錄」一個新問題:

map.login '/account/login', :controller => :user_sessions, :action => :new, :conditions => {:method => :get} 
map.login_post '/account/login', :controller => :user_sessions, :action => :create, :conditions => {:method => :post} 

然後,我更新了我的觀點,以利用新途徑:

<% form_for @user_session, :url => login_post_path do |f| %>

這完美的作品。失敗的登錄會提供相應的錯誤消息並維護「/ account/login」網址。

2

這實際上是此過程的預期行爲。在標準的腳手架式RESTful控制器中,createupdate操作中的驗證錯誤將簡單渲染原始模板而不重定向。這會導致您所看到的 - new模板將與URL中的create操作的URL一起顯示。原因是爲了向用戶顯示發生了什麼錯誤的信息,該視圖必須能夠訪問無效模型對象,在您的案例中爲@user_session

如果要強制重定向到原始URL,則可以使用redirect_to而不是render,但這會導致您丟失有關錯誤的信息。您需要在會話中手動保存錯誤,這會很麻煩。我的建議是不要擔心URL與原始URL不匹配,因爲這在所有Rails應用程序中都是非常標準的。

+0

我很欣賞這個建議,但是我發現強迫性的不一致令人不安。任何在頁面上出現錯誤並想要報告的人都將最終鏈接到單擊鏈接無效的頁面。正如你所說,使用redirect_to並堅持錯誤也是一樣。 – Shaun 2010-12-05 16:01:12

+0

沒有其他選擇。數據必須以某種方式持續存在。要麼你不做重定向,要麼將它存儲在某處並重定向。 – 2010-12-07 20:06:53

1
(基於肖恩的回答在這裏)

爲Rails 4只是增加解決方案:

增加新路線路線文件:

後 '/車/新'=> '車#創建',如: :create_post

添加網址:create_post_path形成標籤

完成。

相關問題