İş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.