साइन-इन के लिए अलग-अलग लेआउट


84

मैं sign_in क्रिया के लिए "devise" नामक एक अलग / कस्टम लेआउट का उपयोग करने की कोशिश कर रहा हूं। मुझे यह पृष्ठ डेविस विकी में मिला , और दूसरा उदाहरण यहां तक ​​कि आप इसे प्रति-क्रिया (इस मामले में, sign_inक्रिया) कर सकते हैं, लेकिन यह ऐसा करने का कोई उदाहरण नहीं दिखाता है। आईआरसी पर किसी ने मुझसे कहा कि मैं यह कोशिश कर सकता हूं:

class ApplicationController < ActionController::Base
  protect_from_forgery

  layout :layout_by_resource

  def layout_by_resource
    if devise_controller? && resource_name == :user && action_name == 'sign_in'
      "devise"
    else
      "application"
    end
  end
end

लेकिन यह काम नहीं कर रहा है क्योंकि यह अभी भी डिफ़ॉल्ट एप्लिकेशन लेआउट को लोड कर रहा है। किसी भी सहायता के लिए धन्यवाद।

जवाबों:


96

एक कार्रवाई के लिए कस्टम लेआउट लागू करने का दूसरा तरीका निम्नलिखित है।

के अनुसार कैसे: कस्टम लेआउट बनाएँ "तुम भी उपयोग कर विशिष्ट वसीयत नियंत्रकों के लिए लेआउट एक कॉलबैक में config / environment.rb (रेल 2) या config / application.rb (रेल 3) एक में किया जाना इस जरूरतों सेट कर सकते हैं। to_prepare कॉलबैक क्योंकि इसे उत्पादन में एक बार निष्पादित किया गया है और विकास में प्रत्येक अनुरोध से पहले। "

config.to_prepare do
    Devise::SessionsController.layout "devise"
    Devise::RegistrationsController.layout proc{ |controller| user_signed_in? ? "application"   : "devise" }
    Devise::ConfirmationsController.layout "devise"
    Devise::UnlocksController.layout "devise"            
    Devise::PasswordsController.layout "devise"        
end

आमतौर पर एक लेआउट भेद लॉगिन के पीछे के पृष्ठों और उन पृष्ठों के बीच किया जाता है जिन्हें प्रमाणीकरण की आवश्यकता नहीं होती है, इसलिए उपरोक्त दृष्टिकोण अधिकांश समय काम करता है। लेकिन मैंने action_nameएक विशेष कार्रवाई के लिए एक लेआउट सेट करने के लिए सहायक का उपयोग करने के साथ प्रयोग किया और इसने आकर्षण की तरह काम किया:

config.to_prepare do
    Devise::SessionsController.layout proc{ |controller| action_name == 'new' ? "devise"   : "application" }
end

मुझे लगता है कि यह ApplicationController में सहायक बनाने के बजाय डेविस कंट्रोलर / एक्शन के आधार पर लेआउट को बदलने के लिए बेहतर और निर्मित तरीका है।


3
साथ ही सर्वर को फिर से शुरू करने के लिए मत भूलना हर बार जब आप कॉन्फ़िगर फ़ोल्डर में किसी भी फाइल में बदलाव करते हैं, तो इस मामले में Rails3 के लिए config / application.rb या रेल्स 2 के लिए config / environment.rb को प्रभावित करने वाले परिवर्तनों के लिए।
जीशान

खबरदार मैं 3.1 में इस विधि की कोशिश की और यह संपत्ति फ़ोल्डर से संपत्ति की लोडिंग काफी धीमी कर देता है। यह उत्पादन सर्वर को प्रभावित नहीं करेगा, लेकिन जब आपके पास कुछ सीएसएस / जेएस फ़ाइलों से अधिक होगा, तो आप इसे नोटिस करेंगे।
गजलर

उपरोक्त उदाहरण में, क्या अलग-अलग डेविस संसाधनों के लिए लेआउट को कॉन्फ़िगर करना संभव है (उदाहरण के लिए, आइए दिखाते हैं कि हमारे पास दो अलग-अलग प्रकार के
वाइस

जब मैं यह कोशिश करता हूं, मुझे एक त्रुटि मिलती है कि यह अब दो स्थानों से एक टेम्पलेट प्राप्त करने की कोशिश कर रहा है। डेविस की पिछली सेटिंग्स को ओवरराइड करने के लिए आपको रेल कैसे मिलती है?
एडम ग्रांट

जो लोग इसे याद करते हैं - रेल 3 सेटअप अलग है - इसे इसमें करें: config / application.rb (रेल 3)।
स्टोन

66

मैंने बस ऐप / व्यू / लेआउट / डेविस / सेशन html.erb बनाया और उसमें अपना लेआउट डाला।


28
महान समाधान! आप /app/views/layouts/devise.html.erb में एक लेआउट भी डाल सकते हैं और क्या यह आपके सभी समर्पित विचारों पर लागू होता है
बस्ती

45

मैंने इसका पता लगा लिया, लेकिन अन्य लोगों के उत्सुक होने की स्थिति में मैं यह सवाल यहाँ रखूँगा।

यह एक मूर्खतापूर्ण गलती थी। तथ्य sign_inमार्ग है, क्रिया नहीं । को देखते हुए प्रासंगिक स्रोत , मैं देख सकता है कि आवश्यकता नहीं है new, यानी, एक बनाने नई वसीयत सत्र। मेरे उपरोक्त कोड की शर्त को बदलना:

if devise_controller? && resource_name == :user && action_name == 'new'

खूबसूरती से काम करता है।

आशा है कि वहाँ किसी की मदद करता है।


क्या यह दोनों पंजीकरण # नए और सत्र # नए के लिए लेआउट लागू नहीं करेगा?
आयुध

12

अब तक का सबसे सरल उपाय है अपने ऐप / विचार / लेआउट फ़ोल्डर में devise.html.haml नामक एक लेआउट बनाना। और रेल जादू बाकी का ख्याल रखता है।

app/views/layouts/devise.html.haml

3
यह बहुत ही सरल तरीका है कि डैविस के लिए एक लेआउट सेट करें। धन्यवाद!
phlegx

8

मैंने इस तरह से इसे किया। यदि उपयोगकर्ता को साइन इन करना था, तो मुझे एक अलग लेआउट चाहिए था, लेकिन यदि उपयोगकर्ता को अपना प्रोफ़ाइल संपादित करना हो तो एक अलग लेआउट।

मैं रेल का उपयोग कर रहा हूँ 4.1.1

एप्लिकेशन कंट्रोलर में, इसे जोड़ें:

class ApplicationController < ActionController::Base
  # Prevent CSRF attacks by raising an exception.
  # For APIs, you may want to use :null_session instead.
  protect_from_forgery with: :exception
  before_action :configure_permitted_parameters, if: :devise_controller?

  layout :layout_by_resource

  # Define the permitted parameters for Devise.
  protected

  def configure_permitted_parameters
    devise_parameter_sanitizer.for(:sign_up) { |u| u.permit(:firstname, :lastname, :email, :password, :password_confirmation)}
    devise_parameter_sanitizer.for(:account_update) { |u| u.permit(:avatar, :firstname, :lastname, :email, :password, :password_confirmation, :current_password) }
  end

  def layout_by_resource
    if devise_controller? and user_signed_in?
      'dashboard'
    else
      'application'
    end
  end
end

7

इस उत्तर को कहीं भी न देखकर आश्चर्य हुआ, लेकिन आप यह भी कर सकते हैं:

मार्गों में.आरबी, कुछ इस तरह से देखने के लिए अपना डेविस कॉन्फिगर बदलें:

  devise_for :users, controllers: {
    sessions: 'sessions'
  }

फिर ऐप / कंट्रोलर / सेशन_कंट्रोलर.आरबी में

class SessionsController < Devise::SessionsController
  layout 'devise', only: [:new]
end

यह विशेष रूप से उपयोगी है यदि आपको डेविस नियंत्रकों में से किसी में अतिरिक्त तर्क करने की आवश्यकता है।


2
यह वास्तव में मैं क्या देख रहा था! दूसरों में से किसी ने किसी कारण से काम नहीं किया: /
djGrill

1

बस अगर आप नहीं जानते थे, तो आप उन rake routesमार्गों / मार्गों को देखने के लिए भी उपयोग कर सकते हैं जिनके साथ वे मैप करते हैं।

 new_user_registration GET    /accounts/sign_up(.:format)       {:action=>"new", :controller=>"devise/registrations"}
edit_user_registration GET    /accounts/edit(.:format)          {:action=>"edit", :controller=>"devise/registrations"}
                       PUT    /accounts(.:format)               {:action=>"update", :controller=>"devise/registrations"}
                       DELETE /accounts(.:format)               {:action=>"destroy", :controller=>"devise/registrations"}

धन्यवाद, मैंने वास्तव में रेक मार्गों के बारे में जाना / जाना है, मैंने सिर्फ एक सेकंड के लिए नहीं सोचा था कि 'sign_in' वास्तविक कार्रवाई का नाम नहीं हो सकता है, मुझे लगा कि यह होगा, तब मुझे एहसास हुआ कि यह सब सत्रों के आसपास घूमता है यही कारण है कि यह नई कार्रवाई से मेल खाती है।
जॉर्ज इज़राइल पेना

0

यहां उन लोगों के लिए एक-लाइनर है, जो चाहते हैं कि सभी नए लेआउट का उपयोग करने की क्रिया करें:

class ApplicationController < ActionController::Base
  protect_from_forgery

  layout Proc.new { |controller| controller.devise_controller? ? 'devise' : 'application' }
end
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.