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]
,儘管包含標題,但不幸)搜索您的用戶。
每次都會發生'forbid' ... – 2012-04-13 22:59:01
檢查我的UPD中的答案。 – jdoe 2012-04-14 07:42:32