不禁认为有一种方法可以稍微干掉这个过程,但是文件不同,但我有点像红宝石n00b而且我觉得客观化/暴露/引用过程仍然不在我的掌握之中。它可行吗?
# 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? }
答案 0 :(得分:1)
我很确定caches_page
的{{1}}选项可以使用方法名称,因此您可以使用简单的mixin:
: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
。
答案 1 :(得分: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
方法,我会考虑覆盖这个方法(未经测试):
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