tasarımda oturum açma eylemi için farklı düzen


84

Sign_in eylemi için "tasarlama" adlı farklı / özel bir düzen kullanmaya çalışıyorum. Bu sayfayı tasarım wiki'sinde buldum ve ikinci örnek bile bunu her eylem için yapabileceğinizi söylüyor (bu durumda sign_ineylem), ancak bunu yapmanın hiçbir örneğini göstermiyor. IRC'deki biri bunu deneyebileceğimi söyledi:

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

Ancak, hala varsayılan uygulama düzenini yüklediği için çalışmıyor gibi görünüyor. Herhangi bir yardım için minnettar olurum.

Yanıtlar:


96

Bir eylem için özel düzen uygulamanın başka bir yolu da aşağıdaki gibidir.

Göre nasıl To: özel düzenleri oluşturma "Ayrıca bir geri arama config / environment.rb (2 raylar) veya config / application.rb (3 raylar) Bu ihtiyaçlar bir yapılacak kullanarak belirli Devise kontrolörleri düzenini ayarlayabilirsiniz. to_prepare callback, çünkü üretimde bir kez ve geliştirmedeki her istekten önce yürütülür. "

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

Genellikle, oturum açma işleminin arkasındaki sayfalar ile kimlik doğrulama gerektirmeyen sayfalar arasında bir düzen ayrımı yapılır, bu nedenle yukarıdaki yaklaşım çoğu zaman işe yarar. Ama aynı zamanda action_name, belirli bir eylem için bir düzen oluşturmak için yardımcı kullanmayı da denedim ve cazip çalıştı:

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

Bence bu, ApplicationController'da bir yardımcı oluşturmak yerine, denetleyiciyi / eylemi tasarlamaya dayalı düzeni değiştirmek için daha iyi ve yerleşik bir yol.


3
Ayrıca, yapılandırma klasöründeki herhangi bir dosyada her değişiklik yaptığınızda, değişikliklerin etkili olması için bu durumda Rails3 için config / application.rb veya Rails 2 için config / environment.rb, her değişiklik yaptığınızda sunucuyu yeniden başlatmayı unutmayın.
Zeeshan

Dikkat edin Bu yöntemi raylar 3.1'de denedim ve varlıkların varlıklar klasöründen yüklenmesini önemli ölçüde yavaşlatıyor. Bu, üretim sunucularını etkilemeyecektir, ancak birkaç css / js dosyanız olduğunda, bunu fark edeceksiniz.
Gazler

Yukarıdaki örnekte, ayrı tasarlama kaynakları için düzenleri yapılandırmak mümkün mü (örneğin, iki farklı türde tasarladığımızı varsayalım ve her birinin kendi düzenine ihtiyacı var)
ckarbass

Bunu denediğimde, şimdi iki konumdan bir şablon almaya çalıştığına dair bir hata alıyorum. Rails'in Devise'ın önceki ayarlarını geçersiz kılmasını nasıl sağlarsınız?
Adam Grant

Kaçıranlar için - Rails 3 kurulumu farklıdır - bunu şurada yapın: config / application.rb (raylar 3).
Stone

66

Az önce app / views / layouts / devise / sessions.html.erb oluşturdum ve yerleşimimi oraya koydum.


28
Harika çözüm! Ayrıca /app/views/layouts/devise.html.erb bir düzen koymak ve onu uygulamak olabilir tüm senin vasiyetle görünümleri
Basti

45

Anladım, ancak diğer insanların merak etmesi durumunda bu soruyu burada tutacağım.

Aptalca bir hataydı. Gerçek şu ki eylem değilsign_in yoldur . İlgili kaynağa baktığımda , gerekli eylemin yeni bir Devise Session oluşturmak olduğunu görebiliyorum . Yukarıdaki kodumun koşulunu şu şekilde değiştiriyorum:new

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

Güzel çalışıyor.

Umarım bu dışarıdaki birine yardımcı olur.


bu, düzeni hem yeni kayıtlar hem de yeni oturumlar için uygulamaz mı?
Ayrad

13

Şimdiye kadarki en basit çözüm, app / views / layouts klasörünüzde devise.html.haml adlı bir düzen oluşturmaktır. ve Rails büyüsü gerisini halleder.

app/views/layouts/devise.html.haml

3
bu, tasarım için bir düzen belirlemenin en basit yoludur. Teşekkür!
balgam

8

Ben böyle yaptım. Kullanıcının oturum açması gerektiğinde farklı bir düzen istedim, ancak kullanıcının profilini düzenlemesi gerekiyorsa farklı bir düzen istedim.

Rails 4.1.1 kullanıyorum

Uygulama denetleyicisinde şunu ekleyin:

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

Bu cevabı hiçbir yerde görmediğiniz için şaşırdım ama bunu da yapabilirsiniz:

Route.rb'de, plan yapılandırmanızı şuna benzer şekilde değiştirin:

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

Sonra app / controllers / sessions_controller.rb içinde

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

Bu, özellikle herhangi bir Devise denetleyicisinde ek mantık geçersiz kılmaları yapmanız gerektiğinde kullanışlıdır.


2
Tam da aradığım buydu! Diğerlerinden hiçbiri bir nedenle çalışmadı: /
djGrill

1

Bilmediğiniz rake routestakdirde, raylar uygulamanızdaki rotaları, eşledikleri eylem / denetleyiciyle birlikte görmek için de kullanabilirsiniz .

 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"}

Teşekkürler, aslında tırmık rotalarını biliyordum / biliyorum, bir an için 'sign_in'in gerçek eylemin adı olmayabileceğini düşündüm, olacağını düşündüm, sonra her şeyin oturumlar etrafında döndüğünü fark ettim bu yüzden yeni eyleme tekabül ediyor.
Jorge Israel Peña

0

İşte tüm eylemleri tasarlamanın yeni bir düzen kullanmasını isteyenler için tek satırlık bir program:

class ApplicationController < ActionController::Base
  protect_from_forgery

  layout Proc.new { |controller| controller.devise_controller? ? 'devise' : 'application' }
end
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.