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)
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服务器,它应该工作.
小智 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
我只是有同样的问题。我的解决方案是这些答案的混合。
:registerable在user.rb:class User < ActiveRecord::Base
devise :database_authenticatable, #:registerable,
:recoverable, :rememberable, :trackable, :validatable
end
Run Code Online (Sandbox Code Playgroud)
devise_forin 中删除注册路径routes.rb:devise_for :users, :skip => [:registrations], controllers: {
sessions: 'users/sessions'
}
Run Code Online (Sandbox Code Playgroud)
现在,Devise 将从他们的视图中跳过所有注册链接,并且您的路线上不再有注册路径。
由于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)
| 归档时间: |
|
| 查看次数: |
12381 次 |
| 最近记录: |