0

Не могу не подумать, что есть способ СУБДАТЬ этот процесс немного, но через файлы, но я немного рубиновый n00b, и я думаю, что объективирование/выставляя/ссылаясь на proc, все еще не понятны. Это выполнимо?Как я могу сушить Rails Controller cache_page if => proc

# controller_1.rb 
caches_page :flu, :if => Proc.new{ |c| c.request.format && !c.request.format.json? && !is_google_bot? && flash[:notice].nil? && flash[:error].nil? } 
caches_page :baz, :if => Proc.new{ |c| c.request.format && !c.request.format.json? && !is_google_bot? && flash[:notice].nil? && flash[:error].nil? } 
# controller_2.rb 
caches_page :foo, :if => Proc.new{ |c| c.request.format && !c.request.format.json? && !is_google_bot? && flash[:notice].nil? && flash[:error].nil? } 
caches_page :bar, :if => Proc.new{ |c| c.request.format && !c.request.format.json? && !is_google_bot? && flash[:notice].nil? && flash[:error].nil? } 

ответ

1

Во-первых, вы можете добавить более одного действия к caches_page. Это упрощает код для:

# controller_1.rb 
caches_page :flu, :baz, :if => Proc.new{ |c| c.request.format && !c.request.format.json? && !is_google_bot? && flash[:notice].nil? && flash[:error].nil? } 

# controller_2.rb 
caches_page :foo, :bar, :if => Proc.new{ |c| c.request.format && !c.request.format.json? && !is_google_bot? && flash[:notice].nil? && flash[:error].nil? } 

Во-вторых, все контроллеры должны наследовать от вашего ApplicationController, следовательно, вы можете поместить этот метод там:

class ApplicationController < ActionController::Base 
    #... 

    private 

    def should_cache_pages? 
    request.format && request.format.json? && !is_google_bot? && flash[:notice].nil? && flash[:error].nil? 
    end 
end 

что упростит эти строки на:

# controller_1.rb 
caches_page :flu, :baz, if: :should_cache_pages? 

# controller_2.rb 
caches_page :foo, :bar, if: :should_cache_pages? 

Однако вы можете пойти еще на один шаг дальше - если вы всегда вызываете метод caches_page с этим ключом if, я бы рассмотрел o verriding этот метод (не проверено):

class ApplicationController < ActionController::Base 
    #... 

    def self.caches_page(*args) 
    options = args.extract_options! 
    options[:if] = Array.wrap(option[:if]) << :should_cache_pages? 
    super *args, options 
    end 

    private 

    def should_cache_pages? 
    request.format && request.format.json? && !is_google_bot? && flash[:notice].nil? && flash[:error].nil? 
    end 
end 

Тогда упрощается:

# controller_1.rb 
caches_page :flu, :baz 

# controller_2.rb 
caches_page :foo, :bar 
1

Я довольно уверен, что caches_page «ы :if вариант можно взять имя метода, чтобы вы могли иметь простой подмешать:

module CacheHelpers 
    def should_be_cached?(c) 
    c.request.format && !c.request.format.json? && !is_google_bot? && flash[:notice].nil? && flash[:error].nil? 
    end 
end 

, а затем include CacheHelpers в классах контроллеров и сказать:

# controller_1.rb 
caches_page :flu, :if => :should_be_cached? 
caches_page :baz, :if => :should_be_cached? 

# controller_2.rb 
caches_page :foo, :if => :should_be_cached? 
caches_page :bar, :if => :should_be_cached? 

Если вы делаете такие вещи в большинстве своих контроллеров, пропустите отдельный CacheHelpers и выбросьте его прямо внутри o ApplicationController.