Rails 5:禁止访问Devise寄存器和登录表单页面

时间:2017-10-03 13:34:42

标签: ruby-on-rails redirect devise ruby-on-rails-5 rails-routing

我有设计 OmniAuth-Twitter 设置。我以前使用Devise的电子邮件注册,然后我切换到Twitter登录。现在我需要禁用电子邮件注册并为每个人登录访问权限。

http://localhost:3000/register
http://localhost:3000/login

我在视图中尝试了下面的代码,但是我收到错误。我假设因为它是ActiveRecord功能。

redirect_to root_path

我无法在Controller中重定向为 before_action:,因为我没有Devise的控制器。

禁止访问此注册表和登录页面的最佳方法是什么?

谢谢!

2 个答案:

答案 0 :(得分:1)

如果您真的想从登录页面和注册页面重定向,则应创建两个扩展Devise::SessionsControllerDevise::RegistrationsController的控制器,然后配置您的路由以使用您的控制器而不是设计的默认控制器使用

以下是登录路径的示例,但注册逻辑相同。

# config/routes.rb
devise_for :users, controllers: { sessions: 'users/sessions' }

# app/controllers/users/sessions_controller.rb
module Users
  class SessionsController < Devise::SessionsController
    def new
      # Redirect wherever you want here
      redirect_to root_path
    end
  end
end

请注意,设计允许您跳过某些路线,但请记住,将排除整个控制器,这可能不是您想要的。

# config/routes.rb
devise_for :users, only: [:passwords]
# or
devise_for :users, skip: [:sessions]

答案 1 :(得分:0)

您不一定需要控制器逻辑,您需要从视图端阻止该功能。您需要修改appname/app/views/devise/registrations/new.html.erbappname/app/views/devise/sessions/new.html.erb以删除要隐藏的表单字段,并删除appname/app/views/devise/shared/_links.html.erb中的内容以及禁止注册。

您希望删除共享_links.html.erb文件中与第8-10行和第12-14行相似的代码。

1 <%- if devise_mapping.omniauthable? %> 
2   <%- resource_class.omniauth_providers.each do |provider| %> 
3     <div class="twitter-button"> 
4     <%= link_to "Sign in with #{OmniAuth::Utils.camelize(provider)}", omniauth_authorize_path(resource_name, provider), class: "twitter-text" %> 
5     </div> 
6   <% end -%> 
7 <% end -%> 
8 <%- if controller_name != 'sessions' && false %> 
9   <%= link_to "Log in", new_session_path(resource_name), class: "forget" %> 
10 <% end -%> 
11 

12 <%- if devise_mapping.registerable? && controller_name != 'registrations' && false %> 
13   <%= link_to "Sign up", new_registration_path(resource_name), class: "forget" %> 
14 <% end -%> 

但是,在一天结束时,我不认为完全禁止那些没有Twitter的人来使用你的应用程序是一个好主意,因为它大大减少了现在可以立即使用您的应用程序的人数。