Rails中的用户名路由

时间:2016-04-07 22:06:56

标签: ruby-on-rails ruby

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

2 个答案:

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

希望它有所帮助!