我试图允许用户按用户名访问他们的帐户,无论他们如何在URL中将其大写。因此,http://example.com/Username会转到与http://example.com/username相同的页面。
我很好,URL的任何其他部分区分大小写(我知道这是标准),但我认为不需要强制用户在URL中获得其用户名的大小写。
可以通过仅在routes.rb文件中添加某些设置来完成吗?
我认为这很简单,但显然不是。
我发现了一个看似简单的问题here但是只有one answer that I think will help并且它太过于hacky(由作者自己承认)
答案 0 :(得分:5)
我认为这不是路由问题,您可以在控制器代码中解决它:
User.where("lower(username) = lower(?)", params[:username]).first!
或
User.where("lower(username) = ?", params[:username].downcase).first!
或
User.find(:first, :conditions => [ "lower(username) = ?", params[:username].downcase ])
答案 1 :(得分:1)
在控制器中处理此行为应该可以正常工作,而不是在路由中。
# config/routes.rb
match ':username' => 'users#show'
# app/controllers/users_controller.rb
def show
username = params[:username]
user = User.find_by_username(username) || User.find_by_username(username.downcase)
# or something along these lines...
end
更好的解决方案可能是为用户存储某种 slug 标识,该标识始终是低级的并且可以在URL中使用。你可以为此目的看看真棒friendly_id gem。