尝试在我的Rails route 使用用户名。
有效的路线:
resources :users, only: [:show, :create, :update, :destroy]
get "/:username" => "users#show", as: :user
get "/:username/account" => "users#account", as: :user_account
get "/:username/interests", to: "users#interests", as: :user_interests
get "/:username/offers" => "users#offers", as: :user_offers
get "/:username/trades" => "users#trades", as: :user_trades
但是现在这样的路线:
get "/signup"
与
/:username
规则匹配我知道我可以重新排列路线,以便/signup出现在前面,但这似乎有点不客气。
有什么办法可以重写吗?还是唯一的保留用户名验证方法?
谢谢
编辑
最后,我用保留字向用户模型添加了一个验证。名称间隔是一个好主意,但我不想污染我的URL。
作为记录,Twitter命名空间的非用户名是这样的:
twitter.com/i/discover(转到“Twitter发现”部分)
twitter.com/discover(转到@discover的个人资料)
据我所知,Pinterest保留了诸如“搜索”之类的名称
我用代码遵循Pinterest的方法:
验证:
validate :reserved_username
private
def reserved_username
reserved_usernames = %w[index show create destroy edit update signup interests interest item items search offers offer community about terms privacy admin map authentication]
errors.add(:reserved_username, "username is reserved for the app") if reserved_usernames.include?(username)
end
最佳答案
路由按定义顺序具有优先级,先覆盖优先级,后覆盖优先级。如果您想让自己的/signup
路径起作用,则需要在/:username
一个之前定义它。这不是hacky,这只是它的工作方式。
可以排除:username
的某些匹配项,但是如果列表太长,则会减慢路由速度,否则您必须将其重新编写为正则表达式,这很可能是hacky的定义。
为任意用户名创建根路径时,应考虑为所有其他路由创建前缀,以免它们冲突。例如,/=/signup
或/-/signup
。如果您不允许在用户名开头使用下划线,则也可以使用/_signup
之类的东西,或者使用其他定义排除项的方式来分配所有其他路由。
这样,您就不必担心在引入新功能或创建一长串详尽的无效名称之前检查用户数据库。
关于ruby-on-rails - URL中的Rails用户名,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16796244/