2015-06-21 19 views
2

很簡單的問題,但我似乎無法找到一個好的谷歌的答案。Rails設計路線:如果用戶登錄,則指向索引。否則,指向新的用戶會話

錯誤:

undefined method `user_signed_in?' for #<ActionDispatch::Routing::Mapper:0x007fc6369320e8> (NoMethodError) 

服務器甚至不會啓動。

我的代碼:

Rails.application.routes.draw do 

devise_for :users, :path_prefix => 'u' 
resources :users 

    devise_scope :user do 
    get "login", to: "devise/sessions#new", as: :login 
    get 'logout', to: 'devise/sessions#destroy', as: :logout 
    get 'user/edit', to: 'devise/registrations#edit', as: :change_password 
    end 

    resources :apps do 
    resources :elements, controller: 'apps/elements' 
    end 

    resources :elements do 
     resources :features, except: [:index], controller: 'apps/elements/features' 
    end 

if user_signed_in? 
    root to: 'apps#index' 
else 
devise_scope :user do 
    root to: 'devise/sessions#new' 
end 
end 

end 

什麼是着手做這項工作的最佳方式是什麼?我很想嘗試解決這個問題,並使網站變得脆弱,成爲一名新的RoR用戶。提前致謝。

+0

你爲什麼不重定向您的控制器動作中的用戶,而不是你的路由 – Cyzanfar

+0

這是一個很好的點。我只是認爲路線是最簡單的方法。我應該如何將它們重定向到設計新會話頁面?到目前爲止,我有'如果user_signed_in? <用戶正在登錄的代碼> else redirect_to <我不知道該怎麼放在這裏>' – Nickdb93

回答

2

在Rails中,訪問控制是在控制器層完成的,而不是在路由層。

路由只是爲不同的參數集和請求URL定義匹配器。它們在rails開始處理請求之前被處理,他們不知道會話的任何內容。 Rails甚至可以使用YML來定義路由,除了Ruby在DSL方面更好。

如果你想要求用戶已登錄你可以使用:

class SomeController < ApplicationController 
    before_action :authenticate_user! # a Devise helper method 
end 
+1

哦,親愛的主。你知道嗎,我在過濾器前使用':authenticate_user!',但是當我在設計特性時,我把'except::index'放在了一起。我不能相信我只是忘了把它關掉,並且正在做各種各樣的愚蠢的東西。感謝您清理它!現在,我再做一次愚蠢的舉動之前還有更多的咖啡。 – Nickdb93

+0

我會說你的答案是有用的,但我是一個代表點遠離能夠。所以代替這一點,謝謝你們兩位! – Nickdb93

+0

所以你必須在你的AppsController中設置'before_action'回調? – Cyzanfar

相關問題