ruby-on-rails – Rails&Devise:覆盖SessionsController

前端之家收集整理的这篇文章主要介绍了ruby-on-rails – Rails&Devise:覆盖SessionsController前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我试图在主页上设置一个登录表单.我按照 Wiki做了这件事

除非登录信息不正确,否则/devise/session/new.html.erb将被渲染.
我不想要我希望我的用户重定向到root_url与闪存消息中的错误.

我能够覆盖registrations_controller.rb的另一个功能,但覆盖sessions_controller.rb给了我很多麻烦.

我想换什么来做我想要的?我仍然希望将用户重定向到after_sign_in_path,如果登录正确.
原控制器为here

到目前为止,我知道我必须在我的路线

devise_for:users,:controllers => {:registrations => “注册”,:sessions => “会议”}

而且我还设置了controller / sessions_controller.rb

  1. class SessionsController < Devise::SessionsController
  2.  
  3. # GET /resource/sign_in
  4. def new
  5. resource = build_resource
  6. clean_up_passwords(resource)
  7. respond_with_navigational(resource,stub_options(resource)){ render_with_scope :new }
  8. end
  9.  
  10. end

我有这样的感觉,我必须改变render_with_scope:新的但…如何?
使用该版本,我得到#< SessionsController:0x5072c88>的错误undefined方法’users_url’

嗯,我会等待你的宝贵帮助

PS:post帮助我很多处理订阅错误.也许这将有助于登录错误

====编辑====

遵循第一个回答建议,我还添加了初始化器/ devise.rb:

  1. config.warden do |manager|
  2. manager.failure_app = CustomFailure
  3. end

用户登录并尝试访问“受限制”区域时,他会被重定向到root_url,但是当登录错误时,我现在有以下错误

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

(PS:我删除了我使用会话控制器所做的一切,如果成功则登录工作)

===编辑2 ===

在此Wiki之后,重定向工作正常,但是我没有任何错误通知.

而且我正在显示警报/通知闪存消息,如果这更改任何东西

  1. <% flash.each do |name,msg| %>
  2. <% if msg.class == Array %>
  3. <% msg.each do |message| %>
  4. <%= content_tag :p,message,:id => "flash_#{name}" %>
  5. <% end %>
  6. <% else %>
  7. <%= content_tag :p,msg,:id => "flash_#{name}" %>
  8. <% end %>
  9. <% end %>

=== FINAL UPDATE ===

接受的答案有效.只是不要忘记显示闪光警报

解决方法

您必须覆盖您的自定义失败设计类.

在lib / custom_failure.rb下添加自定义失败类

  1. class CustomFailure < Devise::FailureApp
  2. def respond
  3. if http_auth?
  4. http_auth
  5. elsif warden_options[:recall]
  6. recall
  7. else
  8. redirect
  9. end
  10. end
  11.  
  12. def redirect
  13. store_location!
  14. flash[:alert] = i18n_message unless flash[:notice]
  15. redirect_to "/"
  16. end
  17.  
  18. def recall
  19. env["PATH_INFO"] = attempted_path
  20. flash.now[:alert] = i18n_message(:invalid)
  21. self.response = recall_controller.action(warden_options[:recall]).call(env)
  22. end
  23.  
  24. protected
  25.  
  26. def i18n_message(default = nil)
  27. message = warden.message || warden_options[:message] || default || :unauthenticated
  28.  
  29. if message.is_a?(Symbol)
  30. I18n.t(:"#{scope}.#{message}",:resource_name => scope,:scope => "devise.failure",:default => [message,message.to_s])
  31. else
  32. message.to_s
  33. end
  34. end
  35.  
  36. def warden_options
  37. env['warden.options']
  38. end
  39.  
  40. def warden
  41. env['warden']
  42. end
  43.  
  44. def recall_controller
  45. "#{params[:controller].camelize}Controller".constantize
  46. end
  47.  
  48.  
  49. def attempted_path
  50. warden_options[:attempted_path]
  51. end
  52.  
  53. def store_location!
  54. session[:"#{scope}_return_to"] = attempted_path if request.get? && !http_auth?
  55. end
  56.  
  57. def attempted_path
  58. warden_options[:attempted_path]
  59. end
  60.  
  61. def http_auth?
  62. !Devise.navigational_formats.include?(request_format) || (request.xhr? && Devise.http_authenticatable_on_xhr)
  63. end
  64. end

在config / application.rb下写下

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

_________________编辑__________________

你说当“注册出错”时,这意味着控件应该在registrations_controller创建方法中.我猜,那里的东西一定是错的.尝试添加这些路由.

  1. devise_for :users
  2.  
  3. devise_scope :user do
  4. root :to => "devise/sessions#new"
  5. get "sign_in",:to => "devise/sessions#new"
  6. get "sign_out",:to => "devise/sessions#destroy"
  7. get "sign_up",:to => "devise/registrations#new"
  8. end

________________编辑2 ________________

在视图/ devise / registrations / new.html.erb中添加

  1. <%= devise_error_messages! %>

猜你在找的Ruby相关文章