有没有办法可以为用户模型添加验证,以便拒绝与已定义路由相同的用户名?
例如:
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
答案 0 :(得分:1)
验证的最简单方法是将用户名作为网址传递,如果有404 PageNotFound
响应,则可以使用用户名:)
答案 1 :(得分:1)
在验证中,您可以遍历所有已定义的路由,并根据所需的用户名进行检查。
这有助于您获取已定义的路径:
Rails.application.routes.routes.each {|r| p r.path.to_s}
答案 2 :(得分:0)
嗯,您实际上已经获得了所需的行为,因为使用了第一个匹配的路由。因此,对 / search 的请求永远不会到达第二条路线。