2016-04-07 14 views

答えて

5

ルートは次のようになります。"get /:username", to: "users#profile"

あなたのコントローラのアクションが呼ばれているものにusers#profileを変更します。

の最後にを入れてください。そうでなければ、はすべてのルートを傍受します。例えば

は、次の手順を実行していない:

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

あなたがpages#barエンドポイントに到達することはできませんので。

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 

を次にがUserControllerに:

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 

希望すると助かります!

関連する問題