Rails 3路由中不区分大小写的用户名

时间:2012-12-03 20:57:00

标签: ruby-on-rails case-sensitive case-insensitive

我试图允许用户按用户名访问他们的帐户,无论他们如何在URL中将其大写。因此,http://example.com/Username会转到与http://example.com/username相同的页面。

我很好,URL的任何其他部分区分大小写(我知道这是标准),但我认为不需要强制用户在URL中获得其用户名的大小写。

可以通过仅在routes.rb文件中添加某些设置来完成吗?

我认为这很简单,但显然不是。

我发现了一个看似简单的问题here但是只有one answer that I think will help并且它太过于hacky(由作者自己承认)

2 个答案:

答案 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