13

Rails 2.3.5 taşıyorum ve bu sorun var: filtresinden önce foo iki kez çağrılan:Rails before_filter neden denetleyici alt sınıf olarak iki kez çağrıldı?

class BaseController < ApplicationController 
    before_filter :foo, :only => [:index] 
end 

class ChildController < BaseController 
    before_filter :foo, :only => [:index, :show, :other, :actions] 
end 

sorun ChildController üzerinde olmasıdır.

Bu soruna geçici bir takım çözümler denedim. Çocuğa :index eylemini dahil etmezsem, bu eylem için hiçbir zaman çağrılmaz.

çözüm Ben eserler bulundu, ama bu sorunu çözmek için daha iyi bir yolu

skip_before_filter :foo 
before_filter :foo, :only => [:index, :show, :other, :actions] 

var mı çok çok çirkin olduğunu düşünüyorum?

cevap

15

"Bu davranış tasarım yüzündendir".

kontrolörleri üzerinde Raylar kılavuzu devletler:

"Eğer ApplicationController bir filtre ayarlarsanız, bu uygulamada her denetleyici çalıştırılacak böylece Filtreler, devralınan"

Bu, gördüğünüz davranışı açıklar. Ayrıca, belirli bir denetleyici ve/veya yöntemler için hangi filtrelerin çalıştırılacağını veya çalıştırılmayacağını tanımlamak için (skip_before_filter kullanarak) tam olarak aynı çözümü önerir.

Çirkin ya da değil, bulduğunuz çözüm ortak ve onaylanmış uygulama gibi görünüyor. Eğer skip_before_filter kullanmak istemiyorsanız

http://guides.rubyonrails.org/action_controller_overview.html#filters

3

hep ChildController yılında index eylemi atlamak olabilir:

class ChildController < BaseController 
    before_filter :foo, :only => [:show, :other, :actions] 
end 

Ama BaseController yılında davranışı değiştirmek eğer bu bir sorun haline gelebilir ve Filtreyi index eyleminden kaldırın. O zaman asla çağrılmayacaktı skip_before_filter kullanmak daha iyi bir fikir olabilir.

İlgili konular