Переопределение макета Gem для контроллера не работает - PullRequest
1 голос
/ 10 декабря 2011

Я сейчас разрабатываю драгоценный камень, который обрабатывает мобильные устройства.

Контроллер выглядит так:

class PageController < ApplicationController
  has_mobile_views

И код драгоценного камня выглядит так:

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'

Макетзагружается и отображается правильно.

У кого-нибудь есть идея, что здесь может быть не так или что нужно изменить в геме, чтобы не испортить макет?

1 Ответ

2 голосов
/ 10 декабря 2011

Предполагается, что

  • mobile_html MIME-тип зарегистрирован в config/initializers/mime-types.rb
  • ваш мобильный макет в app/views/layouts/mobile_application.mobile_html.erb
  • MobileViews модуль включен вваш ApplicationController

, который выполняет работу:

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 
...