[ruby-on-rails-3] 如何刪除Devise路線註冊?



Answers

你可以在你的模型中做到這一點

# typical devise setup in User.rb
devise :database_authenticatable, :registerable, :recoverable, :rememberable, :trackable, :validatable

將其更改為:

devise :database_authenticatable, :recoverable, :rememberable, :trackable, :validatable

注意符號:registerable被刪除

就是這樣,沒有其他要求。 到註冊頁面的所有路線和鏈接也被神奇地移除。

Question

我在Rails 3應用程序中使用Devise,但在這種情況下,用戶必須由現有用戶創建,該用戶決定他/她將擁有哪些權限。

正因為如此,我想:

  • 刪除用戶註冊的路線
  • 仍然允許用戶在註冊後編輯其個人資料 (更改電子郵件地址和密碼)

我怎樣才能做到這一點?

目前,我通過在devise_for :users之前放置以下內容來有效地移除此路線devise_for :users

match 'users/sign_up' => redirect('/404.html')

這有效,但我想有更好的辦法,對吧?

更新

正如Benoit Garret所說,對我而言,最好的解決方案是跳過創建註冊路線,並創建我想要的註冊路線。

為此,我首先運行rake routes ,然後使用輸出重新創建我想要的rake routes 。 最終的結果是:

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

注意:

  • 我仍然有:registerable在我的User模型中:registerable
  • devise/registrations處理更新電子郵件和密碼
  • 更新其他用戶屬性 - 權限等 - 由不同的控制器處理

實際答案:

刪除默認Devise路徑的路由; 即:

devise_for :users, path_names: {
  sign_up: ''
}



我發現這個工作正常,不會弄亂路由或添加應用程序控制器方法。 我的方法是重寫設計方法。 將此添加到app/controllers/devise/registrations_controller.rb為簡潔起見,我省略了其他方法。

class Devise::RegistrationsController < DeviseController
  ...
  # GET /resource/sign_up
  def new
    redirect_to root_path
  end
  ....
end

此外,為了消除這種路徑仍然可以從其他視圖到達的錯覺,您可能還想從app/views/devise/shared/_links.erb刪除此代碼

<%- if devise_mapping.registerable? && controller_name != 'registrations' %>
  <%= link_to "Sign up", new_registration_path(resource_name) %><br />
<% end -%>



我遇到了同樣的問題,我發現從註冊頁面重定向用戶有點不好。 所以我的解決方案基本上不使用:registrable

我所做的就是創建一個類似於編輯用戶詳細信息的頁面,如下所示:

<%= form_tag(update_user_update_path, method: :post) do %>  
    <br>
    <%= label_tag(:currPassword, 'Current password:') %> <%= password_field_tag(:currPassword) %> <br>
    <%= label_tag(:newPassword, 'New password:') %> <%= password_field_tag(:newPassword) %> <br>
    <%= label_tag(:newPasswordConfirm, 'Confirm new password:') %> <%= password_field_tag(:newPasswordConfirm) %> <br>
    <%= submit_tag('Update') %>
<% end %>

所以這個表單提交到一個新的post端點來更新密碼,如下所示:

  def update
    currPass = params['currPassword']
    newPass1 = params['newPassword']
    newPass2 = params['newPasswordConfirm']
    currentUserParams = Hash.new()
    currentUserParams[:current_password] = currPass
    currentUserParams[:password] = newPass1
    currentUserParams[:password_confirmation] = newPass2
    @result = current_user.update_with_password(currentUserParams)
  end

稍後,您可以在視圖中使用@result來告訴用戶密碼是否已更新。




我發現了另一個類似於這個帖子 ,並希望分享@chrisnicola給出的答案。 在帖子中,他們試圖只在製作過程中阻止用戶註冊。

您也可以修改註冊控制器。 你可以使用這樣的東西:

“app / controllers / registrations_controller.rb”

class RegistrationsController < Devise::RegistrationsController
  def new
    flash[:info] = 'Registrations are not open.'
    redirect_to root_path
  end

  def create
    flash[:info] = 'Registrations are not open.'
    redirect_to root_path
  end
end

這將覆蓋設計的控制器,並改為使用上述方法。 他們添加了flash消息,以防某人以某種方式將其發送到sign_up頁面。 您還應該能夠將重定向更改為您喜歡的任何路徑。

另外在“config / routes.rb”中你可以添加這個:

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

如此離開它將允許您使用標准設計編輯您的配置文件。 如果您願意,您仍然可以通過包含來覆蓋編輯配置文件選項

  def update
  end

“app / controllers / registrations_controller.rb”




你可以修改devise寶石本身。 首先,運行以下命令查找使用的安裝位置:

gem which devise

假設路徑是: /usr/local/lib/ruby/gems/1.9.1/gems/devise-1.4.2/lib/devise

然後去

/usr/local/lib/ruby/gems/1.9.1/gems/devise-1.4.2/lib/devise/lib/devise/rails並在該目錄中編輯routes.rb 。 有一個名為def devise_registration(mapping, controllers) ,您可以修改它以擺脫新的操作。 您也可以完全刪除devise_registration的映射




這是一個老問題 - 但我最近解決了同樣的問題,並提出了一個比以下更優雅的解決方案:

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

它給出了命名路由的默認名稱(如cancel_user_registration ),而不會過於冗長。

devise_for :users, skip: [:registrations]

# Recreates the Devise registrations routes
# They act on a singular user (the signed in user)
# Add the actions you want in 'only:'
resource :users,
    only: [:edit, :update, :destroy],
    controller: 'devise/registrations',
    as: :user_registration do
  get 'cancel'
end

用默認設計模塊輸出rake routes

                  Prefix Verb   URI Pattern                    Controller#Action
        new_user_session GET    /users/sign_in(.:format)       devise/sessions#new
            user_session POST   /users/sign_in(.:format)       devise/sessions#create
    destroy_user_session DELETE /users/sign_out(.:format)      devise/sessions#destroy
           user_password POST   /users/password(.:format)      devise/passwords#create
       new_user_password GET    /users/password/new(.:format)  devise/passwords#new
      edit_user_password GET    /users/password/edit(.:format) devise/passwords#edit
                         PATCH  /users/password(.:format)      devise/passwords#update
                         PUT    /users/password(.:format)      devise/passwords#update
cancel_user_registration GET    /users/cancel(.:format)        devise/registrations#cancel
  edit_user_registration GET    /users/edit(.:format)          devise/registrations#edit
       user_registration PATCH  /users(.:format)               devise/registrations#update
                         PUT    /users(.:format)               devise/registrations#update
                         DELETE /users(.:format)               devise/registrations#destroy



我喜歡@ max的answer ,但是當試圖使用它時,由於devise_mapping為零,我遇到了一個錯誤。

我稍微修改了他的解決方案,似乎解決了這個問題。 它需要將調用包裝到devise_scope resource

devise_for :users, skip: [:registrations]

devise_scope :user do
  resource :users,
           only: [:edit, :update, :destroy],
           controller: 'devise/registrations',
           as: :user_registration do
    get 'cancel'
  end
end

請注意, devise_scope需要單數:userresource需要復數:users






Related