ruby on rails 3 - मैं साइन अप करने के लिए डेविस मार्ग को कैसे हटाऊं?




ruby-on-rails-3 routing (10)

मैं एक रेल 3 ऐप में डेविस का उपयोग कर रहा हूं, लेकिन इस मामले में, उपयोगकर्ता को मौजूदा उपयोगकर्ता द्वारा बनाया जाना चाहिए, जो यह निर्धारित करता है कि उसके पास कौन सी अनुमतियां होंगी।

इस वजह से, मैं चाहता हूं:

  • उपयोगकर्ताओं को साइन अप करने के लिए मार्ग को हटाने के लिए
  • साइन अप करने के बाद भी उपयोगकर्ताओं को अपनी प्रोफाइल (ईमेल पता और पासवर्ड बदलें) संपादित करने की अनुमति देता है

मैं यह कैसे कर सकता हूँ?

वर्तमान में, मैं devise_for :users से पहले निम्नलिखित को रखकर प्रभावी ढंग से इस मार्ग को हटा रहा हूं devise_for :users :

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

यह काम करता है, लेकिन मुझे लगता है कि एक बेहतर तरीका है, है ना?

अद्यतन करें

जैसा कि बेनोइट गारेट ने कहा, मेरे मामले में सबसे अच्छा समाधान रजिस्ट्रेशन मार्गों को बड़े पैमाने पर बनाने के लिए छोड़ना है और केवल वही बनाना है जो मैं वास्तव में चाहता हूं।

ऐसा करने के लिए, मैंने पहली बार 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_for :users, path_names: {
  sign_up: ''
}

आप "devise_scope" को "devise_for" से पहले रखकर ओवरराइड कर सकते हैं।

devise_scope :user do
  get "/users/sign_up",  :to => "sites#index"
end

devise_for :users

निश्चित नहीं है कि यह सबसे अच्छा तरीका है, लेकिन यह मेरा समाधान है, क्योंकि यह केवल साइन इन पेज पर रीडायरेक्ट करता है।


आप इसे अपने मॉडल में कर सकते हैं

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

इसे बदलें:

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

ध्यान दें कि प्रतीक :registerable हटा दिया गया था

यही है, और कुछ भी जरूरी नहीं है। पंजीकरण पृष्ठ के सभी मार्ग और लिंक भी जादुई रूप से हटा दिए जाते हैं।


मार्गों को बदलकर वहां आने वाली अन्य समस्याओं का एक पूरा समूह है। मैंने पाया सबसे आसान तरीका निम्नलिखित करना है।

ApplicationController < ActionController::Base
  before_action :dont_allow_user_self_registration

  private

  def dont_allow_user_self_registration
    if ['devise/registrations','devise_invitable/registrations'].include?(params[:controller]) && ['new','create'].include?(params[:action])
      redirect_to root_path
    end
  end
end

मार्गों में यह करो। आरबी

devise_for :users, :controllers => {:registrations => "registrations"}, :skip => [:registrations]
  as :user do
    get 'users/edit' => 'devise/registrations#edit', :as => 'edit_user_registration'
    put 'users' => 'devise/registrations#update', :as => 'user_registration'
end

  devise_scope :user do
    get "/sign_in",  :to => "devise/sessions#new"
    get "/sign_up",  :to => "devise/registrations#new"
  end

जब आप इसे ठीक करने के लिए पृष्ठ पर साइन इन करते हैं, तो आपको अब एक त्रुटि मिल जाएगी। इस परिवर्तन को करें: ऐप / विचार / तैयार / साझा / _links.erb

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

मुझे इस तरह की एक और पोस्ट मिली और मैं @chrisnicola को एक जवाब साझा करना चाहता था। पोस्ट में वे उत्पादन के दौरान केवल उपयोगकर्ता साइनअप को अवरुद्ध करने का प्रयास कर रहे थे।

आप रजिस्ट्रेशन नियंत्रक को भी संशोधित कर सकते हैं। आप इस तरह कुछ उपयोग कर सकते हैं:

"ऐप / नियंत्रक / 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

यह devise के नियंत्रक को ओवरराइड करेगा और इसके बजाय उपर्युक्त तरीकों का उपयोग करेगा। उन्होंने फ़्लैश संदेशों को जोड़ा कि किसी ने किसी भी तरह से साइन_अप पेज पर इसे बनाया है। आपको रीडायरेक्ट को किसी भी पथ पर बदलने में भी सक्षम होना चाहिए।

इसके अलावा "config / routes.rb" में आप इसे जोड़ सकते हैं:

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

इसे इस तरह छोड़ने से आप मानक प्रोफाइल का उपयोग अपनी प्रोफ़ाइल को संपादित करने की अनुमति देंगे। यदि आप चाहें तो आप अभी भी संपादन प्रोफ़ाइल विकल्प को ओवरराइड कर सकते हैं

  def update
  end

"ऐप / नियंत्रक / registrations_controller.rb" में


मेरे पास इसी तरह के मुद्दे को बनाने और नए बनाने के लिए devise_invitable पथ को निकालने का प्रयास किया गया था:

पहले:

 devise_for :users

रेक मार्ग

accept_user_invitation GET    /users/invitation/accept(.:format)           devise/invitations#edit
       user_invitation POST   /users/invitation(.:format)                  devise/invitations#create
   new_user_invitation GET    /users/invitation/new(.:format)              devise/invitations#new
                       PUT    /users/invitation(.:format)                  devise/invitations#update

बाद

devise_for :users , :skip => 'invitation'
devise_scope :user do
  get "/users/invitation/accept", :to => "devise/invitations#edit",   :as => 'accept_user_invitation'
  put "/users/invitation",        :to => "devise/invitations#update", :as => nil
end

रेक मार्ग

accept_user_invitation GET    /users/invitation/accept(.:format)                 devise/invitations#edit
                       PUT    /users/invitation(.:format)                        devise/invitations#update

नोट 1 तैयार स्कोप https://github.com/plataformatec/devise#configuring-routes रूट्स

नोट 2 मैं इसे devise_invitable पर लागू कर रहा हूं लेकिन यह किसी भी devise * सक्षम सुविधा के साथ काम करेगा

महत्वपूर्ण नोट: देखें कि devise_scope उपयोगकर्ता पर उपयोगकर्ता नहीं है? यह सही है, इसके लिए देखो! यह आपको बहुत परेशानी दे सकता है जिससे आपको यह समस्या मिलती है:

Started GET "/users/invitation/accept?invitation_token=xxxxxxx" for 127.0.0.1 
Processing by Devise::InvitationsController#edit as HTML
  Parameters: {"invitation_token"=>"6Fy5CgFHtjWfjsCyr3hG"}
 [Devise] Could not find devise mapping for path "/users/invitation/accept?  invitation_token=6Fy5CgFHtjWfjsCyr3hG".
This may happen for two reasons:

1) You forgot to wrap your route inside the scope block. For example:

  devise_scope :user do
     match "/some/route" => "some_devise_controller"
  end

 2) You are testing a Devise controller bypassing the router.
   If so, you can explicitly tell Devise which mapping to use:

    @request.env["devise.mapping"] = Devise.mappings[:user]

मेरे मामले में दूसरों के लिए।
devise (3.5.2) साथ devise (3.5.2)
मैंने सफलतापूर्वक मार्गों को साइनअप करने के लिए हटा दिया, लेकिन निम्नलिखित कोड के साथ प्रोफ़ाइल को संपादित करने के लिए रखा।

#routes.rb
devise_for :users, skip: [:registrations]
as :user do
  get 'users/edit' => 'devise/registrations#edit', :as => 'edit_user_registration'
  put '/users(.:format)' => 'devise/registrations#update', as: 'user_registration'
  patch '/users(.:format)' => 'devise/registrations#update'
end

मैं थोड़ा अलग रास्ता यहां गया हूं। यह ऐसा करता है ताकि आपको devise/shared/_links.html.erb व्यू को ओवरराइड करने की आवश्यकता न हो।

app/models/user.rb :

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

config/routes.rb :

devise_for :users
devise_scope :user do
  put 'users' => 'devise/registrations#update', as: 'user_registration'
  get 'users/edit' => 'devise/registrations#edit', as: 'edit_user_registration'
  delete 'users' => 'devise/registrations#destroy', as: 'registration'
end

पहले:

$ rake routes | grep devise
           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
          user_registration POST   /users(.:format)                            devise/registrations#create
      new_user_registration GET    /users/sign_up(.:format)                    devise/registrations#new
     edit_user_registration GET    /users/edit(.:format)                       devise/registrations#edit
                            PATCH  /users(.:format)                            devise/registrations#update
                            PUT    /users(.:format)                            devise/registrations#update
                            DELETE /users(.:format)                            devise/registrations#destroy

बाद:

$ rake routes | grep devise
           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
          user_registration PUT    /users(.:format)                            devise/registrations#update
     edit_user_registration GET    /users/edit(.:format)                       devise/registrations#edit
               registration DELETE /users(.:format)                            devise/registrations#destroy

मैंने इसे मार्गों के साथ गड़बड़ किए बिना या एप्लिकेशन नियंत्रक विधियों को जोड़ने के बिना अच्छी तरह से काम करने के लिए पाया है। मेरा दृष्टिकोण devise विधि को ओवरराइड करना है। 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 -%>

यह एक पुराना सवाल है - लेकिन मैंने हाल ही में एक ही समस्या हल की है और एक समाधान के साथ आया है जो कि कहीं अधिक सुरुचिपूर्ण है:

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

डिफ़ॉल्ट devise मॉड्यूल के साथ 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




devise