2012-07-17 43 views
3

我想正確的路由短網址的用戶名

/users/1

/username

我知道這意味着我來代替那種用戶配置文件的意見我們需要檢查各種碰撞。我請教以下類似的SO問題:

這裏是我已經試過各種失敗的routes.rb路由定義,和相關的錯誤:

  1. match "/:username" => "users#show", via: "get"

    這裏的錯誤:

    ActiveRecord::RecordNotFound in UsersController#show 
    
    Couldn't find User without an ID 
    
    app/controllers/users_controller.rb:7:in `show' 
    

    這是我與users_controller:如上

    6 def show 
    7 @user = User.find(params[:id]) 
    8 end 
    
  2. match "/:username" => 'users#show', :as => :profile

    同樣的錯誤。

  3. match "/:username", :controller => "users/:id", :action => 'show'

    Routing Error 
    
    uninitialized constant Users 
    
    Try running rake routes for more information on available routes. 
    
  4. match '/:username', :controller => 'users', :action => 'show'

    同樣的錯誤1.

  5. match '/:username', to: 'users/:id', via: 'show'

    服務器無法啓動。

  6. match "/:username" => redirect("https://stackoverflow.com/users/:id")

    錯誤:

    ActiveRecord::RecordNotFound in UsersController#show 
    
    Couldn't find User with id=:id 
    

任何想法,爲什麼我的路由工作不相同的方式,其他人誰問這個問題的是什麼?

更新

只是把這個問題了意見,並把它的問題更乾淨。在通過下面的@Ryan Bigg進行更改後,我在創建新配置文件時重定向到配置文件時出現路由問題。這裏是我創建的代碼:

def create 
    @user = User.new(params[:user]) 
    if @user.save 
     session[:user_id] = @user.id 
     flash[:success] = "Thank you for signing up." 
     redirect_to ('/'[email protected]) 
     #redirect_to @user, notice: "Thank you for signing up!" 
    else 
     render "new" 
    end 
    end 

這裏是我的user.rb

def to_param 
    self.username 
    #username 
end 

然而,註釋掉重定向,我認爲應與to_param更新工作,不工作,而醜陋的黑客在它之上。爲什麼to_param覆蓋,which worked for other people,不適用於我的應用程序?我的#update和#edit方法也不起作用,因爲如果覆蓋to_param不處理這個問題,它們的重定向轉到「users/1/edit」而不是「username/edit」。

回答

3

第一個是正確的,但不能正常工作,因爲你還在試圖做這樣的事情你的控制器內:

User.find(params[:username]) 

時候你應該改爲這樣:

User.find_by_username!(params[:username]) 

第一個嘗試通過您的表的主鍵查找,第二個將正確地在用戶名字段上查詢。

+0

我明白了。你能向我解釋當前控制器風格有什麼問題嗎?我應該如何正確地思考其他問題? – Mittenchops 2012-07-17 01:55:07

+0

@Mittenchops更新回答。 – 2012-07-17 02:06:54

+0

瑞恩,你已經非常徹底地回答了我的問題,但是我可以通過詢問如何命名重定向路線來跟進嗎?我正在嘗試這個,這是不工作,在我的創建用戶方法下:\t \t'@user = User.new(params [:user])\t if @ user.save redirect_to @ user.username' – Mittenchops 2012-07-17 15:36:53

0

除了爲to_params更新,路由文件的底部需要以下行:

resources :users, :path => '/'