2010-02-05 79 views
1

我試圖維持一個漂亮的URL具有失敗的驗證用戶註冊時與自定義路線渲染操作

我有一個路由文件看起來像以下:

map.resources :users 
map.signup '/signup', :controller => "users", :action => "new" 

此作品不夠好,所不同的是,如果一個用戶註冊過程中進入無效的信息,則創建方法執行以下操作:

def create 
    @user = User.new(params[:user]) 
    if @user.save 
     flash[:notice] = "Successfully Registered." 
     redirect_to root_url 
    else 
     render :action => 'new' 
    end 
end 

這工作,但是,如果信息是正確的它的SwitchE是domain.com/users的URL。如果我將其切換到redirect_to'/註冊'它可以工作,但所有以前輸入的信息都會丟失,我希望保持這一點。

有沒有什麼辦法可以在驗證失敗期間保持我的好網站?

回答

2

你需要的條件添加到您的路線:

# Routes files 
map.resources :users 

map.signup "/signup", :controller => "users", :action => "new", :conditions => { :method => :get } 
map.signup "/signup", :controller => "users", :action => "create", :conditions => { :method => :post } 

然後,你」您需要確保您的控制器和視圖正確處理它們:

# Controller 
def new 
    @user = User.new 
end 

def create 
    @user = User.new(params[:user]) 

    if @user.save 
    flash[:notice] = "Successfully registered." 
    redirect_to root_url 
    else 
    render "new" 
    end 
end 

# new.html.erb 
<% form_for @user, :url => signup_path do |form| %> 
    .... 
<% end %> 
+0

完美無瑕。 – Ryan 2010-02-08 17:51:45

0

嘗試增加路線:

map.signup_post '/signup', :controller => "users", :action => "create", :method => :post 

而且在你的表格:

<%= form_for @user, :url => signup_post_path do |f| %> 
+0

感謝您的回覆。不幸的是,如果我這樣做,它仍然不會對錯誤消息和先前的值產生懷疑。 – Ryan 2010-02-05 21:30:16

+0

你能從你的視圖粘貼代碼嗎? – klew 2010-02-05 22:18:37

+0

我是否正確理解你,當@ user.save由於驗證而失敗時,你希望URL爲domain.com/signup而不是'domain.com/users/create'? – klew 2010-02-05 22:21:16