Ruby on rails Rails中的用户名路由

Ruby on rails Rails中的用户名路由,ruby-on-rails,ruby,Ruby On Rails,Ruby,我正在尝试创建一个项目,其中/username被重定向到该用户名的配置文件。我怎样才能做到这一点呢?路线是:“get/:username”,到:“users#profile” 您可以将users#profile更改为调用控制器操作的任何内容 您需要确保将此放在路线的末尾。否则它将拦截你的所有路线 例如,不要执行以下操作: get "/:username", to: "users#profile" get "/foo", to: "pages#bar" 因为您永远无法到达页面#栏端点 前面的答案

我正在尝试创建一个项目,其中/username被重定向到该用户名的配置文件。我怎样才能做到这一点呢?

路线是:
“get/:username”,到:“users#profile”

您可以将
users#profile
更改为调用控制器操作的任何内容

您需要确保将此放在路线的末尾。否则它将拦截你的所有路线

例如,不要执行以下操作:

get "/:username", to: "users#profile"
get "/foo", to: "pages#bar"

因为您永远无法到达
页面#栏
端点

前面的答案的问题是,路由中不匹配的任何内容都将被路由到
用户#profile

或者,为了解决这个问题,您可以创建一个动态路由器,如下所示:

class DynamicRouter
  def self.load
    Rails.application.routes.draw do
      User.all.each do |user|
        puts "Routing #{user.name}"
        get "/#{user.name}", :to => "users#profile", defaults: { id: user.id }
      end
    end
  end

  def self.reload
    Rails.application.routes_reloader.reload!
  end
end
然后在UsersController上:

class UsersController < ApplicationController
  def profile
    @user = User.find(params[:id])
    redirect_to not_found_path unless @user
  end
end
最后,要在添加/更新用户时重新加载路由,请执行以下操作:

class User < ActiveRecord::Base
  ...
  after_save :reload_routes

  def reload_routes
    DynamicRouter.reload
  end
end
class用户
希望有帮助

class User < ActiveRecord::Base
  ...
  after_save :reload_routes

  def reload_routes
    DynamicRouter.reload
  end
end