Ruby on rails 如何将应用程序布局打包到Ruby gem中?

Ruby on rails 如何将应用程序布局打包到Ruby gem中?,ruby-on-rails,layout,view,gem,gemspecs,Ruby On Rails,Layout,View,Gem,Gemspecs,我正在做一个包含三个不同应用程序的项目。他们应该共享一些模型和外部布局。为了避免代码重复,我尝试将应用程序布局(project\u name/app/views/layouts/application.html.haml)提取到gem中 我遵循以下步骤: 使用bundle gem common 将布局文件放在common/app/views/layouts/application.html.haml 编写gempec描述符 # -*- encoding: utf-8 -*- require Fi

我正在做一个包含三个不同应用程序的项目。他们应该共享一些模型和外部布局。为了避免代码重复,我尝试将应用程序布局(
project\u name/app/views/layouts/application.html.haml
)提取到gem中

我遵循以下步骤:

  • 使用
    bundle gem common
  • 将布局文件放在
    common/app/views/layouts/application.html.haml
  • 编写gempec描述符

    # -*- encoding: utf-8 -*-
    require File.expand_path('../lib/common/version', __FILE__)
    
    Gem::Specification.new do |gem|
      gem.authors       = ["Arthur Alkmim"]
      gem.email         = ["myemail@here"]
      gem.description   = %q{Common project files}
      gem.summary       = %q{Common project files, including layout and migrations}
      gem.homepage      = ""
    
      gem.files         = `git ls-files`.split($\)
      gem.executables   = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
      gem.test_files    = gem.files.grep(%r{^(test|spec|features)/})
      gem.name          = "common"
      gem.require_paths = ["lib"]
      gem.version       = Common::VERSION
    end
    
  • 提交更改

  • gem build common.gemspec
    (成功)
  • rake安装
    (成功)
  • gem“common”
    放在项目文件中
  • 但项目仍然不会加载应用程序布局。我应该如何告诉我的项目它必须通过gem加载布局文件


    提前感谢。

    您是否已将gem添加到Rails gem文件中以将其包含在应用程序中

    您可以使用路径选项指定开发中的相对路径。e、 g

    gem 'common', :path => "../path/to/gem"
    

    别忘了运行
    bundle install

    我解决了这个问题。我将
    application.html.haml
    更改为
    common.html.haml
    ,并在ApplicationController中放置了相关的布局调用。似乎Rails不允许我将application.html布局打包到gem中,但其他布局也可以。如果有人提出了更好的解决方案(少一些变通方法),请发布

    使用git子模块或svn外部如何?如果您选择gem路线,那么无论何时发生更改,您都必须构建/安装。@KreeK子模块和外部模块有点麻烦。根据我的经验,处理gems更容易——只需运行
    bundle install
    就可以了。Git子模块尤其令人讨厌。我会为你的gem提供一个生成器。让它用您的版本替换
    application.html.haml
    。类似于
    railsgcommon:install
    的东西,我认为这比简单地装饰控制器更麻烦。每次更新gem时,我都必须重新运行生成器,并且再次受到代码重复的困扰。出于好奇,您是否删除了使用gem的应用程序中的
    app/views/layouts/application.html.haml