Лучший способ потребовать движки Haml on Rails3

Я разрабатываю приложение для движка Rails3 и хочу использовать Haml для представлений.

Во-первых, я добавил это в Gemfile движка:

gem "haml"

Пока я тестировал свой движок, он работал нормально (я использовал https://github.com/josevalim/enginex, чтобы сгенерировать гем и протестировать его с помощью фиктивного приложения).

Мои проблемы начались, когда я попытался использовать движок в реальном приложении Rails. Приложение не имеет драгоценного камня «haml» в своем собственном Gemfile, поэтому оно не инициализировало Haml, поэтому я получал ошибки «template not found», поскольку оно не искало представления .haml. Я думал, что если потребуется Haml на движке, этого будет достаточно, чтобы он также требовался приложением Rails.

Что я сделал на данный момент, так это добавил config/initializers/haml.rb в движок с этим кодом:

require 'haml'
Haml.init_rails(binding)

Сейчас это работает, но мне интересно, действительно ли это хороший способ сделать это. Почему Rails не вызывает файл Haml «init.rb» и поэтому правильно не инициализирует Haml, просто добавляя gem «haml» в Gemfile движка?


person fkreusch    schedule 16.02.2011    source источник


Ответы (2)


Необходимы две вещи. Во-первых, в .gemspec:

s.add_dependency 'haml', ['>= 3.0.0']

И в вашем lib/gem_name.rb:

require 'haml'

А затем запустите bundle внутри каталогов gem и app.

person Paweł Gościcki    schedule 04.08.2011
comment
Я понимаю, что вы ответили на этот вопрос через много месяцев после первоначального вопроса, но, погуглив различные перестановки движка рельсов, я не вижу, что я делаю неправильно. Все, что мне было нужно, это require 'haml' кусок, который, как я полагал, будет выполняться автоматически, поскольку моя спецификация драгоценных камней использует в зависимости "haml-rails". Большое спасибо за это! - person nzifnab; 12.10.2011
comment
Могу ли я предложить вам добавить требование к my_engine/application_controller.rb, так как именно оно используется. - person Kris; 08.05.2015
comment
@ Крис, не все движки драгоценных камней имеют ApplicationController, поэтому я не уверен, что вам это нужно. - person Paweł Gościcki; 15.05.2015
comment
Я сделал предположение, что если вы визуализируете HTML, вы делаете это с контроллера. - person Kris; 19.05.2015
comment
Гем может содержать только набор партиалов без каких-либо контроллеров. Можно придумать множество различных применений и конфигураций. - person Paweł Gościcki; 19.05.2015
comment
Конечно, в таком случае совет неприменим. - person Kris; 22.05.2015

Я думаю, вам придется поместить haml в gemspec движка в качестве зависимости, чтобы упаковщик мог установить haml в целевом приложении (и отобразиться в его Gemfile.lock). Что-то вроде этого:

Gem::Specification.new do |s|
  s.add_dependency(%q<haml>, [">= 0"])
end

Я только что проверил это на одном из своих двигателей. Без зависимости в .gemspec он не устанавливал haml в целевом приложении (не отображался в Gemfile.lock). После того, как я добавил haml в gemspec в качестве зависимости, он появился:

PATH
  remote: /rails_plugins/mine/my_engine
  specs:
    my_engine (0.0.0)
      formtastic
      haml
      inherited_resources
      settingslogic
      sqlite3-ruby

GEM
  remote: http://rubygems.org/
  specs:
    #................
    haml (3.0.25)
    #................

Если вы используете ювелир, он автоматически добавит зависимости в gemspec на основе того, что находится в вашем Gemfile. Я только бегло взглянул на enginex, поэтому не знаю, есть ли у него аналогичная задача rake для создания gemspec.

Это может помочь прояснить некоторые вещи:

http://yehudakatz.com/2010/12/16/уточнение-ролей-оф-гемспека-и-гемфайла/

person johnmcaliley    schedule 16.02.2011
comment
Это помогло. Также было необходимо включить require 'haml' где-то в движке. - person higginbotham; 28.05.2011
comment
да, кажется, я пропустил это. Обычно я добавляю его в основной файл ruby. Для my_plugin это будет вверху my_plugin/lib/my_plugin.rb - person johnmcaliley; 28.05.2011