İşlem başına düzen düzenliyor mu?


165

Bazı eylemler için farklı bir düzen kullanıyorum (çoğunlukla denetleyicilerin çoğundaki yeni eylem için).

Düzeni belirtmenin en iyi yolunun ne olacağını merak ediyorum? (Aynı denetleyicide 3 veya daha fazla farklı düzen kullanıyorum)

Kullanmayı sevmiyorum

render: layout => 'ad'

Yapmayı sevdim

düzen 'isim',: sadece => [: yeni]

Ama bunu 2 veya daha fazla farklı düzen belirtmek için kullanamıyorum.

Örneğin:

Düzeni aynı denetleyicide, farklı düzen adları ve yalnızca farklı seçeneklerle 2 kez çağırdığımda, ilki yok sayılır - bu işlemler belirttiğim düzende görüntülenmiyor.

Not: Rails 2 kullanıyorum.


1
Raylar Kılavuzları belgeleri: guides.rubyonrails.org/…
Kevin

1
İyi bir nokta. Rails 2 belgeleri: guides.rubyonrails.org/v2.3.11/…
Kevin

2
(Ayrıca, gelecekteki okuyuculara yardımcı olmak için rehber yayınladım. Sorununuzu uzun zaman önce çözdüğünüzden şüphem yok ;-)
Kevin

Yanıtlar:


297

Düzeni ayarlamak için bir yöntem kullanabilirsiniz.

class MyController < ApplicationController
  layout :resolve_layout

  # ...

  private

  def resolve_layout
    case action_name
    when "new", "create"
      "some_layout"
    when "index"
      "other_layout"
    else
      "application"
    end
  end
end

22
Harika, teşekkürler. Ve birisinin tek astarla daha basit şeyler yapmak istemesi durumunda aşağıdakiler mümkündür. Okunması ve kontrol cihazının üstüne yerleştirilmesi kolaydır. ---layout Proc.new{ ['index', 'new', 'create'].include?(action_name) ? 'some_layout' : 'other_layout' }
holli

1
Çeşitli düzenler sırasıyla birkaç farklı css & js dosyası kullanıyorsa, bunun uygulama performansı üzerinde büyük bir etkisi olur mu?
Noz

15
-1: Çok karmaşık. Aşağıdaki yorum ( stackoverflow.com/a/21203783/285154 ) en iyi seçenektir.
dimitarvp

Teşekkürler! Bu, Rails 4.2'de hala bir sorundur, belki de sadece birçok seviyede miras alan denetleyiciler kullanıyorsanız. Daha önce yöntem kullandım, ama şimdi sorun yaşadığımda tekrar teşekkürler.
244an

@dimitko hayır değil, zaten sorunun kendisinde bu çözüm referans. 3 veya daha fazla farklı düzen kullanmak istiyorsanız (tam olarak benim durumum gibi) çalışmaz.
mrbrdo

201

Yalnızca iki düzen arasında seçim yapıyorsanız, şunları kullanabilirsiniz :only:

class ProductsController < ApplicationController
   layout "admin", only: [:new, :edit]
end

veya

class ProductsController < ApplicationController
   layout "application", only: [:index]
end

2
Buradaki sorun, düzeni koşullu olarak belirlemek için current_user gibi nesnelere erişememeniz
Andrew K

@AndrewK Dinamik olarak bir düzen seçmek, sorulan sorunun bir parçası gibi görünmüyor.
Nick

11
Sorunuzdan herhangi birini okursanız, sorunun kendisi için bu çözümü açıkladığımdan ve bunun benim durumumda neden çalışmadığından (3 veya daha fazla düzen) bunun doğru cevap olmadığını bileceksiniz.
mrbrdo

2
Mrbrdo'nun dediği gibi, bu cevap değil. Sorusu özellikle belirtiyor (I am using 3 or more different layouts in the same controller). Bu yanıt, farklı düzenlere değil bir düzene ve düzene izin vermez .
Michael

49

Answer_to öğesini kullanarak tek bir eylemin düzenini belirtebilirsiniz :

  def foo
    @model = Bar.first
    respond_to do |format|
      format.html {render :layout => 'application'}
    end
  end

Bana göre bu daha esnek bir cevap. layout "[...]" to the controller class only allows one statement effectively. If you have more than two layouts to deal with (say, admin, generic_app, tailored_app), you will experience Bu eylemin hatalarında İşleme ve / veya yönlendirme uygulanarak bazı şeyleri KURUTMAK; ve bu öneriyi kullanmaktan başka seçeneğiniz yok.
Jerome

1
Bu cevap, anahtarlı veya içindeki ifadeleri kullanarak yöntemleri kullanmak yerine, en iyisidir, basit ve temizdir.
kev

ayrıca erb dosyasını ve düzenini de belirleyebilir: format.html { render 'custom_index', layout: 'application' } aynı şekilde.
thatway_3

12

Oluşturma işlemini kullanarak eylem düzenini de belirtebilirsiniz:

def foo
  render layout: "application"
end


7

Denetleyici altında düzeni belirtmenin çeşitli yolları:

  1. Aşağıdaki kodda, application_1 düzeni index altında çağrılır ve Users denetleyicisinin eylemini göster ve diğer işlemler için uygulama düzeni (varsayılan düzen) çağrılır.

    class UsersController < ApplicationController
      layout "application_1", only: [:index, :show]
    end
  2. Aşağıdaki kodda, Users denetleyicisinin tüm eylemleri için application_1 düzeni çağrılır.

    class UsersController < ApplicationController
       layout "application_1"
    end
  3. Aşağıdaki kodda, yalnızca Kullanıcı denetleyicilerinin sınama eylemi için application_1 düzeni çağrılır ve diğer tüm eylem uygulama düzeni (varsayılan) çağrılır.

        class UsersController < ApplicationController
          def test
            render layout: "application_1"
          end
        end

5

Hassas :

Gerçekten değil ama çalışan bir KURU yol yukarıda gördüğünüz, ancak bir hassasiyetle: düzeni çalışmak için değişkenlerinizin ("@some") sonra olması gerekir . Gibi :

def your_action
   @some = foo
   render layout: "your_layout"
end

Ve yok :

def your_action
   render layout: "your_layout"
   @some = foo
   @foo = some
end

Eğer bir before_action yaparsanız ... bu da işe yaramaz.

Umarım yardımcı olur.

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.