控制器的 Gem 覆盖布局不起作用



我目前正在开发一个处理移动设备的gem。

控制器看起来像这样:

class PageController < ApplicationController
  has_mobile_views

gem的代码如下所示:

module MobileViewsController
  module ClassMethods
    def has_mobile_views(args={})
      class_eval do
        if request.subdomain == 'm'
          request.format = :mobile_html
          layout Proc.new { |controller| controller.request.subdomain == 'm' ? 'mobile_application' : 'application'}
      end
    end
  end
end

格式工作得很好,它呈现xxx.mobile_html。Haml文件很好,但不工作的是加载布局。它不加载任何布局

但是另一方面当我改变
 controller.request.subdomain == 'm' ? 'mobile_application' : 'application'

 controller.request.subdomain == 'm' ? 'xmobile_application' : 'application'

它抛出一个错误,xmobile_application不能被找到,所以它必须至少寻找它。

这个也不能用:

class PageController < ApplicationController
  has_mobile_views
  layout 'mobile_application'

但是当我把PageController改成

class PageController < ApplicationController
  layout 'mobile_application'

布局正在被正确加载和渲染。

有没有人知道这里可能有什么问题,或者在宝石中改变什么以不搞砸布局?

假设有

  • mobile_htmlconfig/initializers/mime-types.rb
  • 中注册的mime类型
  • 你的移动布局在app/views/layouts/mobile_application.mobile_html.erb
  • ApplicationController 包含
  • MobileViews模块

完成工作:

module MobileViewsController
  def self.included(base)
    base.extend ClassMethods
  end
  module ClassMethods
    def has_mobile_views(args = {})
      before_filter Proc.new {
        request.format = :mobile_html if request.subdomain == 'm'
      }
      layout Proc.new { |c|
        c.request.subdomain == 'm' ? 'mobile_application' : 'application'
      }
    end
  end
end 

最新更新