2016-04-07 27 views

cevap

5

rota olacaktır: "get /:username", to: "users#profile"

Sen denetleyicisi eylem denir ne olursa olsun hiç users#profile değişirdi.

Bu numaralı telefonu rotalarınızın sonundaki sonuna koyduğunuzdan emin olmanız gerekir. Aksi takdirde, numaralı rotanızdaki tüm rotaları arayacaktır. Örneğin

aşağıdakileri yapmayın:

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

Eğer pages#bar noktasına ulaşmak için muktedir asla çünkü.

4

Önceki yanıtla ilgili sorun, rotalarda eşleşmeyen herhangi bir şeyin users#profile'a yönlendirilmesidir.

Alternatif ve bu sorunu çözmek için, aşağıdaki gibi, dinamik bir yönlendirici oluşturabilirsiniz:

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 

Sonra UsersController tarih:

class UsersController < ApplicationController 
    def profile 
    @user = User.find(params[:id]) 
    redirect_to not_found_path unless @user 
    end 
end 

Ve aslında sunucu başlangıcında güzergahların oluşturulması için : bir kullanıcı eklendi/güncellendiğinde Nihayet

Rails.application.routes.draw do 
    ... 
    get 'not_found' => 'somecontroller#not_found', as: :not_found 
    DynamicRouter.load 
end 

yolları yeniden:

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

    def reload_routes 
    DynamicRouter.reload 
    end 
end 

Umut eder!

İlgili konular