2011-09-09 19 views
1

我在application.html.erb中添加了一個導航菜單,可以在authlogic中導航用戶。所有路由器如::logout,:register和:login似乎都適用於自定義路徑。如何自定義具有漂亮網址的edit_user_path

match 'account/login' => 'user_sessions#new', :as => :login 
match 'account/logout' => 'user_sessions#destroy', :as => :logout 
match 'register' => 'users#new', :as => :register 

這裏是導航菜單:

<% if current_user %> 
    <%= link_to "Edit Profile", edit_user_path(current_user.id)%> <%=h current_user.firstname %> 
    <%= link_to "Logout", :logout %> 
<% else %> 
    <%= link_to "Register", :register %> | 
    <%= link_to "Login", :login %> 
<% end %> 

但edit_user_path被轉移我/users/:id/edit。如何爲此路徑創建漂亮的網址。我想使它成爲/account/edit。它還需要禁用此路徑/users/:id/edit以防止用戶請求不屬於他/她的另一個用戶ID。它應該拋出一個404頁面是完美的。

在導航菜單當前路徑:

註銷:/account/logout

登錄:/account/login

註冊:/register

我很想有edit_user_path另一條路徑:

編輯資料:/account/edit

有沒有什麼辦法可以簡單地使用edit_user_path(current_user.id),路徑會自動將我轉移到/ account/edit並禁用id請求。

任何幫助將不勝感激!謝謝!

[更新]這是我/config/router.rb

Appcatous::Application.routes.draw do 
    resources :users, :user_sessions 

    match "account" => "users#show", :as => :account 
    match 'account/login' => 'user_sessions#new', :as => :login 
    match 'account/logout' => 'user_sessions#destroy', :as => :logout 
end 

users.rb的模式很簡單:

class User < ActiveRecord::Base 
    acts_as_authentic 

    validates :firstname, :presence => true 
    validates :lastname, :presence => true 

end 

回答

0

,如果你提供的所有路由這將是有益的問題 - 這也意味着用戶的路線。你創建那些:

resources :users 

在你做的情況下,你必須禁用命令,並重新只是需要手動與路線(例子):

match 'account/edit' => 'users#edit', :as => :edit_user 

或任何你控制器被命名。這樣你會得到你的「/帳戶/編輯」 - 但是,你也無法以這種方式傳輸用戶ID。你必須通過其他方式進行傳輸,例如通過存儲在cookie或會話中的變量。 無論如何,後一種方法是記住用戶認證的常用方法。

+0

嗨,我已經做到了,但我不喜歡那樣。我也會阻止用戶請求ID。使用自定義路由器似乎是簡單的解決方案,但用戶仍然可以訪問/ users /:id/edit。我的問題是,如果我們仍然可以在模板代碼中使用** edit_user_path(current_user.id)**,但路徑已更改。 – lnguyen55

+1

如果您使用自定義路線而不是'resources:users',那麼不,用戶將無法訪問/ users /:id/edit。而且你不能兩種方式 - 無論你有在URL中的ID或你沒有。但在後一種情況下,您必須通過會話或cookie來傳輸它。畢竟,http是一個無狀態的協議。 – Rhywden

+0

嗯,似乎'current_user.id'不會工作了沒有資源:用戶' – lnguyen55