如何从Devise中删除/禁用注册

M.T*_*vis 24 ruby rubygems ruby-on-rails devise

我正在尝试从Devise中删除/禁用'user/sign_up'路径.我这样做是因为我不希望随机的人获得对应用程序的访问权限.我在部分工作中通过在routes.rb中添加以下内容来实现

Rails.application.routes.draw do
  devise_scope :user do
    get "/sign_in" => "devise/sessions#new" # custom path to login/sign_in
    get "/sign_up" => "devise/registrations#new", as: "new_user_registration" # custom path to sign_up/registration
  end

...

devise_for :users, :skip => :registration

end
Run Code Online (Sandbox Code Playgroud)

然而,这打破了 <%= link_to "Profile", edit_user_registration_path, class: "btn btn-info btn-flat" %>

我想保留,以便用户可以更新他们的个人资料.我知道这是因为devise_for :users, :skip => :registration

这个问题有解决方案吗?

运行

设计(4.2.0,4.1.1,4.1.0)

Rails 4.2.5

ruby 2.3.0p0(2015-12-25修订版53290)[x86_64-linux]

小智 46

最简单的方法是从模型中定义的默认列表中删除":registerable"设计模块(用于应用程序用户的类名,通常是User).

class User < ActiveRecord::Base
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :trackable, :validatable

  ...
end
Run Code Online (Sandbox Code Playgroud)

所以你会这样:

class User < ActiveRecord::Base
  devise :database_authenticatable,
         :recoverable, :rememberable, :trackable, :validatable

  ...
end
Run Code Online (Sandbox Code Playgroud)

  • 不幸的是,这并不能解决原始问题中描述的问题.此方法会破坏`edit_user_registration_path`,阻止用户更新其帐户详细信息. (10认同)
  • 它立即消除了路线,它会很好,它也会在创建视图时跳过registrations文件夹.但你只需要删除那个.没有人可以在网站上注册.这对于控制管理员来说非常有效. (3认同)

M.T*_*vis 15

从Devise中删除sign_up路径的解决方案

在开头输入以下内容 routes.rb

Rails.application.routes.draw do
  devise_scope :user do
    get "/sign_in" => "devise/sessions#new" # custom path to login/sign_in
    get "/sign_up" => "devise/registrations#new", as: "new_user_registration" # custom path to sign_up/registration
  end
Run Code Online (Sandbox Code Playgroud)

...在上述声明之后,在下面添加以下内容 routes.rb

devise_for :users, :skip => [:registrations] 
  as :user do
  get 'users/edit' => 'devise/registrations#edit', :as => 'edit_user_registration'
  put 'users' => 'devise/registrations#update', :as => 'user_registration'
  end
Run Code Online (Sandbox Code Playgroud)

这将删除/禁用user/sign_upDevise 的路径而不会中断edit_user_registration_path

重新启动rails服务器,它应该工作.

  • 你能解释一下为什么第一个块是必要的吗? (2认同)

小智 8

从控制器重定向

我通过将控制器中的 /sign_up 重定向到 /sign_in 解决了这个问题,同时保留了编辑用户信息的功能。例如:

在控制器/用户/registrations_controller.rb中

# GET /resource/sign_up
  def new
    redirect_to new_user_session_path and return
    super
  end
Run Code Online (Sandbox Code Playgroud)

在routes.rb中,我将注册资源指向该控制器:

  devise_for :users, controllers: {
    sessions: 'users/sessions',
    registrations: 'users/registrations'
  }
Run Code Online (Sandbox Code Playgroud)

因此,每当用户访问路线 /sign_up 时,它都会将他们重定向到 /sign_in。and return请记住在重定向后使用以防止多次渲染/重定向


小智 6

我只是有同样的问题。我的解决方案是这些答案的混合。

  1. 注释或删除:registerableuser.rb
class User < ActiveRecord::Base
  devise :database_authenticatable, #:registerable,
         :recoverable, :rememberable, :trackable, :validatable
end
Run Code Online (Sandbox Code Playgroud)
  1. devise_forin 中删除注册路径routes.rb
devise_for :users, :skip => [:registrations], controllers: {
  sessions: 'users/sessions'
}
Run Code Online (Sandbox Code Playgroud)

现在,Devise 将从他们的视图中跳过所有注册链接,并且您的路线上不再有注册路径。


Tom*_*lin 5

由于as只是devise_scope的别名,您可以将所有内容放在一个块中。

devise_for :users, skip: [:registrations]
as :user do
  get "/sign_in" => "devise/sessions#new" # custom path to login/sign_in
  get "/sign_up" => "devise/registrations#new", as: "new_user_registration" # custom path to sign_up/registration
  get 'users/edit' => 'devise/registrations#edit', :as => 'edit_user_registration'
  put 'users' => 'devise/registrations#update', :as => 'user_registration'
end
Run Code Online (Sandbox Code Playgroud)