模型验证以拒绝用户名定义的路由

时间:2011-05-12 22:22:50

标签: ruby-on-rails ruby-on-rails-3

有没有办法可以为用户模型添加验证,以便拒绝与已定义路由相同的用户名?

例如:

get 'search'
get :username => "users#show", :as => :user

如果用户输入“search”作为用户名,它将拒绝它,因为它已经作为铁路路线存在。

可能的其他方法是创建一个明确的黑名单,但显然在添加新路由时需要更多维护。

修改

将答案改编成工作解决方案:

validate :username_blacklist

private
@@username_blacklist = nil

# checks if the username is on a blacklist
def username_blacklist
  unless @@username_blacklist
    @@username_blacklist = Set.new [ "badword", "naughtybadfun"]
    Rails.application.routes.routes.each do |r|
      reserved_word = File.dirname(r.path).split('/')[1]
      @@username_blacklist << reserved_word if reserved_word
    end
  end

  errors.add(:username, "is restricted") if @@username_blacklist.include?(username)
end

3 个答案:

答案 0 :(得分:1)

验证的最简单方法是将用户名作为网址传递,如果有404 PageNotFound响应,则可以使用用户名:)

答案 1 :(得分:1)

在验证中,您可以遍历所有已定义的路由,并根据所需的用户名进行检查。

这有助于您获取已定义的路径:

Rails.application.routes.routes.each {|r| p r.path.to_s}

答案 2 :(得分:0)

嗯,您实际上已经获得了所需的行为,因为使用了第一个匹配的路由。因此,对 / search 的请求永远不会到达第二条路线。