Padrino: совместное использование макета между основным проектом и вспомогательными приложениями - PullRequest
0 голосов
/ 04 февраля 2012

Как я могу использовать макет основных проектов для своих подпрограмм?

Существует опция макета для контроллера ... но что бы я установил значение, чтобы он мог вернуться в родительский проект и использовать вместо него его application.haml?

Я попытался добавить:

File.expand_path('../../app/views/layouts/application.haml', __FILE__)

К сожалению, в контроллере похоже, что путь к текущей папке макетов приложений всегда добавляется в начало, так что в итоге получается что-то вроде

c:/sites/demo/app01/views/layouts/c:/sites/demo/app/views/layouts/application.haml

Кроме того, .haml уже добавлен, поэтому, если вы добавите его в контроллер, вы получите

application.haml.haml

Это относится только к контроллеру.

На основании этих результатов я переместил код в подпрограмму app.rb, что на самом деле лучше для моей ситуации.

Однако основной макет не отображается, поэтому я вижу только результаты текущего действия контроллера. Он не выводит макет.

Я пробовал без файла ext, с помощью etc ... Возвращаемый путь верен ... поэтому я не уверен, почему он не используется?

По крайней мере, в контроллере он выдавал ошибку, потому что это был недопустимый аргумент.

Наличие кода в app.rb для моего вспомогательного приложения не приводит к ошибке, но также не отображает макет. Просто результат просмотра.

Ответы [ 3 ]

0 голосов
/ 06 февраля 2012

Я потратил немного времени, чтобы увидеть, где были проблемы с контроллером, в ожидании макета с текущей папкой макета приложения, когда вы указали путь к файлу abs.

file: padrino-core / application / render.rb

метод: fetch_layout_path

Я добавил if / else для проверки пути к файлу abs.

return cached_layout_path if cached_layout_path
if File.exists?(layout_name.to_s)
    layout_path = layout_name.to_sym
else
    has_layout_at_root = Dir["#{views}/#{layout_name}.*"].any?
    layout_path = has_layout_at_root ? layout_name.to_sym : File.join('layouts', layout_name.to_s).to_sym
    end
@_cached_layout[layout_name] = layout_path unless reload_templates?
layout_path

Тем не менее, он все еще выдает ошибку.

file: sinatra-1.3.2 / lib / sinatra / base.rb

метод: find_template

Я добавил

yield name.to_s if File.exists?(name.to_s)

прямо перед

yield ::File.join(views, "#{name}.#{@preferred_extension}")

Это сработало без ошибок.

IЯ новичок в ruby ​​и, тем более, в sinatra / pandrino, так что это может быть неправильный подход, но он работает и позволит мне двигаться дальше в моем текущем развитии.

DAddYE: Я бы хотелбыть заинтересованным в ответе от вас относительно лучшей альтернативы?Я не уверен, почему установка макета в app.rb дочернего приложения, похоже, ничего не делает, я попытаюсь разобраться позже.

0 голосов
/ 06 марта 2012

fetch_layout_path ДОЛЖЕН быть относительным путем.Так что вы должны сделать это в padrino-core / application / render.rb :

Это работает для меня.Но это не идеальный способ, если падрино разрешит вложенное подпрограмму.

  def fetch_layout_path(given_layout=nil)
    layout_name = given_layout || @layout || :application
    @_cached_layout ||= {}
    cached_layout_path = @_cached_layout[layout_name]
    return cached_layout_path if cached_layout_path
    has_layout_at_root = Dir["#{views}/#{layout_name}.*"].any?
    layout_path = has_layout_at_root ? layout_name.to_sym : File.join('layouts', layout_name.to_s).to_sym
    # Check the layout file is exists in sub-app? 
    # try to use the root project's layout if not
    # added via riceball
    has_layout = Dir["#{views}/#{layout_path}.*"].any?
    layout_path = has_layout ? layout_path : File.join('..', '..', 'app', 'views', layout_path.to_s).to_sym
    @_cached_layout[layout_name] = layout_path unless reload_templates?
    layout_path
  end
0 голосов
/ 04 февраля 2012

Вы можете использовать внутри основного приложения или контроллера:

# in project/parent_app/sub_app/app.rb
layout File.expand_path('../../parent_app/views/application.haml', __FILE__)

это будет отображать:

# project/parent_app/views/application.haml
...