2011-05-24 65 views
14

我試圖在我的主頁上設置一個登錄表單。我設法遵循WikiRails&Devise:覆蓋SessionsController

除了,如果登錄信息不正確,則會呈現/devise/session/new.html.erb。 我不想那樣。我希望我的用戶被重定向到閃存郵件中的錯誤root_urlWITH

我能夠覆蓋registrations_controller.rb的另一個功能,但覆蓋sessions_controller.rb給了我很多麻煩。

我想改變做我想做的事情?如果登錄正確,我仍然希望將用戶重定向到after_sign_in_path。 原來的控制器是here

到目前爲止,我知道我必須做的是,在我的routes.rb

devise_for :users, :controllers => { :registrations => "registrations", :sessions => "sessions" }

而且我還設置了controller/sessions_controller.rb

class SessionsController < Devise::SessionsController 

    # GET /resource/sign_in 
    def new 
    resource = build_resource 
    clean_up_passwords(resource) 
    respond_with_navigational(resource, stub_options(resource)){ render_with_scope :new } 
    end 

end 

我有一種感覺,我必須改變render_with_scope :new但是......怎麼樣? 與該版本,我得到的錯誤undefined method 'users_url' for #<SessionsController:0x5072c88>

好吧,我等你的寶貴幫助

PS:這post幫助了我很多關於訂閱處理錯誤。也許它會幫助登錄錯誤?

==== ====編輯

繼1RST答案的建議,我也加入到initializers/devise.rb

config.warden do |manager| 
    manager.failure_app = CustomFailure 
end 

當用戶沒有登錄並試圖訪問一個「限制「區域,他被重定向到root_url,但是當登錄出現問題時,我現在有以下錯誤:

The action 'devise/sessions#new' could not be found for Devise::SessionsController 

(PS:我刪除了我與會話控制器,所做的一切,並在日誌中,如果成功的作品)

=== EDIT 2 ===

在此之後Wiki重定向完美的作品我不沒有任何錯誤通知。

而且我與顯示警報/通知閃光燈消息,如果改變任何東西

<% flash.each do |name, msg| %>   
    <% if msg.class == Array %> 
    <% msg.each do |message| %> 
    <%= content_tag :p, message, :id => "flash_#{name}" %> 
    <% end %> 
    <% else %>   
    <%= content_tag :p, msg, :id => "flash_#{name}" %>   
    <% end %> 
<% end %> 

===最後更新===

接受的答案的作品。只是不要忘記顯示flash alerts

+1

終於來了!一個回答我永恆懷疑的問題。 – 2011-10-20 23:07:49

回答

15

你必須重寫你的自定義故障設計類。

添加這個自定義類的故障在lib/custom_failure.rb

class CustomFailure < Devise::FailureApp 
    def respond 
    if http_auth? 
     http_auth 
    elsif warden_options[:recall] 
     recall 
    else 
     redirect 
    end 
    end 

    def redirect 
     store_location! 
     flash[:alert] = i18n_message unless flash[:notice] 
     redirect_to "/" 
    end 

    def recall 
    env["PATH_INFO"] = attempted_path 
    flash.now[:alert] = i18n_message(:invalid) 
    self.response = recall_controller.action(warden_options[:recall]).call(env) 
    end 

    protected 

    def i18n_message(default = nil) 
    message = warden.message || warden_options[:message] || default || :unauthenticated 

    if message.is_a?(Symbol) 
     I18n.t(:"#{scope}.#{message}", :resource_name => scope, 
      :scope => "devise.failure", :default => [message, message.to_s]) 
    else 
     message.to_s 
    end 
    end 

    def warden_options 
    env['warden.options'] 
    end 

    def warden 
    env['warden'] 
    end 

    def recall_controller 
    "#{params[:controller].camelize}Controller".constantize 
    end 


    def attempted_path 
    warden_options[:attempted_path] 
    end 

    def store_location! 
    session[:"#{scope}_return_to"] = attempted_path if request.get? && !http_auth? 
    end 

    def attempted_path 
    warden_options[:attempted_path] 
    end 

    def http_auth? 
    !Devise.navigational_formats.include?(request_format) || (request.xhr? && Devise.http_authenticatable_on_xhr) 
    end 
end 

寫這篇文章下的config/application.rb中

config.autoload_paths += %W(#{config.root}/lib) 

_________________Edit __________________

你說的時候,「註冊出錯了「,這意味着控制應該在registrations_controller create方法中。我想,那裏肯定有錯。嘗試添加這些路線。

devise_for :users 

    devise_scope :user do 
    root :to => "devise/sessions#new" 
    get "sign_in", :to => "devise/sessions#new" 
    get "sign_out", :to => "devise/sessions#destroy" 
    get "sign_up", :to => "devise/registrations#new" 
    end 

________________Edit 2 ________________

添加這觀點/設計/註冊/ new.html.erb

<%= devise_error_messages! %> 
+0

沒有工作。我想爲Rails添加任何東西來考慮這個文件? – Lucas 2011-05-24 12:39:35

+0

你必須將config.autoload_paths + =%W(#{config.root}/lib)添加到config/application.rb文件中 最新錯誤?你只需要安裝設計寶石.. – 2011-05-24 12:49:27

+0

我用你的答案更新了我的文章。 :) – Lucas 2011-05-24 12:51:46

3

如果你要替換色器件會話控制器,當運行到錯誤undefined method 'users_url' for #<SessionsController:0x5072c88>您可以提供如下的路徑名稱。您錯過的重要補充是, :as => :users

devise_scope :user do 
    root :to => "devise/sessions#new", :as => :users 
    get "sign_in", :to => "devise/sessions#new" 
    get "sign_out", :to => "devise/sessions#destroy" 
    get "sign_up", :to => "devise/registrations#new" 
    end 

上述路由名稱可能與現有或未來路由衝突。作爲替代方案,我發現,這種設置趨於正常工作:

devise_for :users, 
    :path_names => { :sign_out => 'logout', 
         :sign_in => 'login', 
         :sign_up => 'register' }, 
    :controllers => { :sessions => 'users/sessions' } do 

     # Sessions 
     post '/login'   => 'users/sessions#create',  :as => :user_session 
     get '/login'   => 'users/sessions#new',   :as => :new_user_session 
     get '/logout'  => 'users/sessions#destroy',  :as => :destroy_user_session 

     # Passwords 
     post '/password'  => 'devise/passwords#create',  :as => :user_password 
     put '/password'  => 'devise/passwords#update' 
     get '/password/new' => 'devise/passwords#new',  :as => :new_user_password 
     get '/password/edit' => 'devise/passwords#edit',  :as => :edit_user_password 

     # Registrations 
     post '/register' => 'devise/registrations#create', :as => :user_registration 
     get '/register' => 'devise/registrations#new', :as => :new_user_registration 
     get '/account'  => 'devise/registrations#edit', :as => :edit_user_registration 
     put '/account'  => 'devise/registrations#update' 
     delete '/account'  => 'devise/registrations#destroy' 

    end 
0

調試提示試圖刪除任何記錄(用戶將是一致的);如果你去看演出,這不是一個設計配置問題。對於這種情況,請遵循(其他情況在這裏回答)

我看不到在哪裏調用根javascript文件。

我幾次在這一個上打了我的頭,在不同的佈局中使用不同的javascript設置。無論你的頭讀取,呼叫

<%= javascript_include_tag 'my-differntly-fangled-application' %> 

需要有相關的清單文件包括

//= require jquery 
//= require jquery_ujs