2012-04-12 42 views
3

碰撞如果我想用戶的URL看起來像如何防止個人資料網址,與其他路線

http://site.com/foobar 

,而不是

http://site.com/users/foobar 

foobar將是用戶的從nickname列中的暱稱用戶模型。我將如何防止用戶註冊頂級路線?像聯繫人,關於,註銷等?

我可以有一個保留名稱的表。所以當用戶註冊一個暱稱時,它會檢查這個表。但是有沒有更方便的方法?

回答

1
if(Rails.application.routes.recognize_path('nickname') rescue nil) 
    # forbid using desired nickname 
else 
    # nickname can be used -- no collisions with existing paths 
end 

UPD:

如果任何路徑似乎是由recognize_path那麼你已經有了類似的認可:在你routes.rb結束

get ':nick' => 'user#show' 

這導致了任何路徑都可路由的情況。要解決這個問題,你必須使用約束條件。我會告訴你一個例子:

# in routes.rb 
class NickMustExistConstraint 
    def self.matches?(req) 
     req.original_url =~ %r[//.*?/(.*)] # finds jdoe in http://site.com/jdoe. You have to look at this regexp, but you got the idea. 
     User.find_by_nick $1 
    end 
end 
get ':nick' => 'users#show', constraints: NickMustExistConstraint 

這樣,我們把一些動態到我們的路由系統,如果我們已經有了一個用戶與尼克jdoe然後路線/jdoe將被識別。如果我們沒有用戶使用暱稱rroe/rroe路徑將不可路由。

,如果我是你,我只想做兩件事情:

# in User.rb 
def to_param 
    nick 
end 
# in routing.rb 
resources :users, path: 'u' 

這會給我得到像/u/jdoe路徑(這是相當簡單的,完全符合REST)的能力。

在這種情況下,請確保您通過User.find_by_nick! params[:id](是的,它仍然是params[:id],儘管包含標題,但不幸)搜索您的用戶。

+0

每次都會發生'forbid' ... – 2012-04-13 22:59:01

+0

檢查我的UPD中的答案。 – jdoe 2012-04-14 07:42:32