【问题标题】:Does it make sense to create a Ruby gem that consists of only Rails template partials?创建一个仅包含 Rails 模板部分的 Ruby gem 有意义吗?
【发布时间】:2009-10-26 08:18:51
【问题描述】:
我试图了解 Ruby gems 中哪些是有效的,哪些是无效的(主要是从为自己创建一个以将功能从一个项目重用到下一个项目的角度来看)。
当您创建 Ruby gem 时,您是否仅限于包含 Ruby 功能,或者您可以创建一个包含 Rails 模板、CSS 文件和 JavaScript 的 gem?
如果是这样,gem 的用户将如何访问 Rails 项目中的这些资源(除了在 environment.rb 文件中添加“config gem”语句之外?
【问题讨论】:
标签:
ruby-on-rails
ruby
rubygems
【解决方案1】:
不,它没有。 Gem 是代码库,而不是静态文件。
加载 gem 时,不会将文件移动到公共目录。您加载一个 ruby 文件并访问一个模块。因此,您只能在其中执行 ruby 代码。
但是,您的 ruby 代码可以为您提供一些帮助,例如让您轻松构建您的设计。
如果您想在每个 ruby 项目中包含一些静态文件资源,我会看到两种解决方案:
第一个解决方案是我最喜欢的,但您可能想采用另一个解决方案。
【解决方案2】:
正如 dmathieu 所说,gem 用于安装在系统加载路径中的 ruby 库,而不是用于进入项目目录的东西。但是,如果您确实想将 Rails 项目骨架打包为 gem,那么使用一个小的 ruby 可执行文件作为生成器将骨架项目树复制到目标目录中就足够简单了。然后你可以把整个东西打包成一个gem,你的骨架文件可以放在gem目录中,你可以说generate_new_project someproject将它们复制到你的新项目目录中。
【解决方案3】:
您可以轻松添加部分视图和其他 HAML、Builder 或 ERB 视图。以下结构应该可以工作:
# in my_gem/rails/init.rb
ActionController::Base.append_view_path(File.expand_path(File.join(File.dirname(__FILE__), '..', 'views')))
# in my_gem/views/my_gem/_some_partial.html.erb
This is a partial from MyGem!
# in your_rails_app/views/some_controller/some_view.html.erb:
<%= render :partial => '/my_gem/some_partial' -%>
不过,这并不能直接回答您关于静态文件的问题。通常最好的选择是将 CSS、JS 和其他文件复制到公共目录的生成器。或者,您可以使用 StaticFilesController 并将静态文件放在该视图目录中。