【问题标题】:Best way to require Haml on Rails3 engines要求Haml on Rails3引擎的最佳方法
【发布时间】:2011-02-16 10:32:35
【问题描述】:

我正在开发一个 Rails3 引擎应用程序,我想将 Haml 用于视图。

首先,我所做的是将这个添加到引擎 Gemfile 中:

gem "haml"

当我测试我的引擎时,它工作正常(我使用https://github.com/josevalim/enginex 生成 gem 并使用虚拟应用程序对其进行测试)。

当我尝试在真正的 Rails 应用程序上使用引擎时,我的问题就开始了。该应用程序在它自己的 Gemfile 上没有 gem“haml”,因此它没有初始化 Haml,所以我收到了模板未找到错误,因为它不是在寻找 .haml 视图。我在想,通过在引擎上需要 Haml,Rails 应用程序也需要它就足够了。

我现在所做的是使用以下代码在引擎上添加一个 config/initializers/haml.rb:

require 'haml'
Haml.init_rails(binding)

它现在正在工作,但我想知道这是否真的是一个好方法。 为什么 Rails 没有调用 Haml "init.rb" 文件,而是通过将 gem "haml" 添加到引擎 Gemfile 来正确初始化 Haml?

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3 haml rails-engines


    【解决方案1】:

    有两件事是必要的。首先,在 .gemspec 中:

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

    在你的 lib/gem_name.rb 中:

    require 'haml'
    

    然后在 gem 和 app 目录中运行 bundle

    【讨论】:

    • 我意识到您在最初的问题之后的几个月内回答了这个问题,但是在谷歌上搜索“rails engine can't see haml”的各种排列时,我找不到我做错了什么。我所需要的只是require 'haml' 部分,我认为它会自动完成,因为我的 gemspec 在依赖项中使用了“haml-rails”。非常感谢!
    • 我可以建议您将要求添加到my_engine/application_controller.rb,因为这是使用的地方。
    • @Kris 并非所有 gem 引擎都有 ApplicationController,所以我不确定你需要什么。
    • 我假设如果您正在渲染 HTML,那么您是从控制器中进行的。
    • 一个gem只能包含一个partials的集合,没有任何控制器。可以考虑许多不同的用途和配置。
    【解决方案2】:

    我认为您必须将 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)
        #................
    

    如果您使用珠宝商,它会根据您的 Gemfile 中的内容自动将依赖项添加到 gemspec 中。如果您在 Gemfile 中定义了组,它甚至会添加一个 development_dependency。我只是简单地看了一下enginex,所以我不知道它是否有类似的rake任务来构建gemspec。

    这可能有助于澄清一些事情:

    http://yehudakatz.com/2010/12/16/clarifying-the-roles-of-the-gemspec-and-gemfile/

    【讨论】:

    • 这有帮助。还必须确保在引擎中的某处包含“require 'haml'”。
    • 是的,我想我漏掉了。我通常将它添加到主 ruby​​ 文件中。对于 my_plugin,它将位于 my_plugin/lib/my_plugin.rb 的顶部
    猜你喜欢
    • 2012-01-10
    • 1970-01-01
    • 1970-01-01
    • 2020-07-11
    • 1970-01-01
    • 2011-05-05
    • 2011-09-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多