我正在尝试创建一个项目,其中 / username 被重定向到该用户名的个人资料。我怎样才能做到这一点?
答案 0 :(得分:6)
路线为:"get /:username", to: "users#profile"
您可以将users#profile
更改为调用控制器操作的任何内容。
您需要确保将放在路线的末尾。否则它将拦截你所有的路线。
例如,请勿执行以下操作:
get "/:username", to: "users#profile"
get "/foo", to: "pages#bar"
因为您永远无法访问pages#bar
端点。
答案 1 :(得分:4)
上一个答案的问题是,路线中不匹配的任何内容都会被路由到users#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
并在服务器启动时实际生成路由:
Rails.application.routes.draw do
...
get 'not_found' => 'somecontroller#not_found', as: :not_found
DynamicRouter.load
end
最后在添加/更新用户时重新加载路线:
class User < ActiveRecord::Base
...
after_save :reload_routes
def reload_routes
DynamicRouter.reload
end
end
希望它有所帮助!