如果=> proc,如何干掉Rails控制器cache_page

时间:2014-02-03 19:09:46

标签: ruby-on-rails ruby ruby-on-rails-3.2 proc actioncontroller

不禁认为有一种方法可以稍微干掉这个过程,但是文件不同,但我有点像红宝石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? }

2 个答案:

答案 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