1

我正在尝试创建一个 Rails 应用程序模板 我有这段代码

file 'config/sass.rb', <<-RUBY

  Sass::Engine::DEFAULT_OPTIONS[:load_paths].tap do |load_paths|
    load_paths << "#{Rails.root}/app/assets/stylesheets"
    load_paths << "#{Gem.loaded_specs['compass'].full_gem_path}/frameworks/compass/stylesheets"
  end

RUBY

当我使用此模板运行“rails new”时,出现以下错误:

undefined method `root' for Rails:Module (NoMethodError)

我是应用程序模板以及此代码块语法的新手。(你怎么称呼那个 <<-RUBY 块?在谷歌上搜索真的很难)。我的印象是它不会在块内运行任何代码,因此它不应该导致错误。是什么赋予了?

更新:让我添加更多上下文:

我正在尝试在此处修改应用程序模板:https ://github.com/leshill/rails3-app/blob/master/app.rb我想添加此博客文章中的代码:http: //metaskills.net/ 2011/05/18/use-compass-sass-framework-files-with-the-rails-3.1-asset-pipeline/这样我就可以在 rails3.1 中获得指南针支持

4

2 回答 2

2

详细说明穆的观点。

语法定义字符串的<<-SOMESTIRING开头。字符串以SOMESTRING(在行首)终止

例如,你经常看到这个

  string = <<-EOF
    Hey this is a really long string

    with lots of new lines
  EOF
  string # => "  Hey this is a really long string\n\n  with lots of new lines\n"

在这种情况下,RUBYis 表示这是 ruby​​ 代码(将被评估)。您必须记住,当在字符串中时,#{ruby_code}转义语法将评估给定的 ruby​​_code 并将结果插入到字符串中。

所以为了解决这个问题,你可以做类似的事情,

    irb >> s = <<-RUBY
      "#{'#{Rails.root}'}/app/assets/stylesheets"
    RUBY
    #=> ""\#{Rails.root}/app/assets/stylesheets"\n"

在这里,我们使用分隔字符串#{},然后使用单引号告诉 ruby​​ 我们不想要#{Rails.root}评估。

编辑:我在考虑更多,并意识到这是等效的并且更清洁

  irb >> s= <<-RUBY
    Rails.root.to_s + "/app/assets/stylesheets"
  RUBY #=> "Rails.root.to_s + "/app/assets/stylesheets"\n"

这样我们就完全不用担心逃跑了:)

于 2011-06-11T01:04:51.417 回答
1

您正在要求“rails new”命令创建一个文件并使用“heredoc”(由<<-SOMESTRING语法发出信号)传递一个内容块。关于heredoc的更多信息:

http://en.wikipedia.org/wiki/Here_document#Ruby

解析器会将内容视为用双引号括起来的 Ruby 字符串,并尝试替换 . 括起来的任何字符串#{}。它失败了,因为它找不到名为 的变量Rails.root

您可以通过使用 single-quote-style-heredoc 来避免替换行为(将内容视为被单引号包围的 Ruby 字符串)。用单引号包围 heredoc 信号:

文件 'config/sass.rb', <<-'RUBY'

Sass::Engine::DEFAULT_OPTIONS[:load_paths]。点击执行 |load_paths| load_paths << "#{Rails.root}/app/assets/stylesheets" load_paths << "#{Gem.loaded_specs['compass'].full_gem_path}/frameworks/compass/stylesheets" 结束

红宝石

由于您正在为初学者应用程序创建 Rails 应用程序模板,因此查看

来自GitHub 上Rails Apps项目的Rails 3.1 应用程序模板。

该项目提供了很好的应用程序模板示例和文档(一定要看看Thor::ActionsRails::Generators::Actions)。

于 2011-06-22T21:14:03.640 回答