2011-06-10 32 views
1

我试图创建一个Rails应用程序模板,当我跑我的代码块中有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 

“新轨道”这个模板,我得到了以下错误:

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

我是新来的应用程序模板以及此代码块语法。 (你甚至称之为< < -RUBY block?在google上搜索真的很难)。这是我的印象,它不会运行块内的任何代码,所以它不应该导致错误。是什么赋予了?

UPDATE:我再补充一些背景:

我想在这里修改应用程序模板: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

+1

'<< - RUBY'构造被称为“heredoc”,这是Bourne Shell(AKA'/ bin/sh')中语法的起源(AFAIK)。 – 2011-06-11 00:12:48

回答

1

你是询问“rails new”命令创建一个文件并使用“heredoc”传递一个内容块(由<<-SOMESTRING语法表示)。更多关于定界符:

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

解析器将把内容,就像一个Ruby字符串由双引号包围,并试图通过对被#{}封闭任何字符串。它失败是因为它找不到名为Rails.root的变量。

通过使用单引号样式heredoc,可以避免替换行为(使内容像被单引号包围的Ruby字符串一样对待)。环绕与singlequotes的定界符信号:

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应用程序模板,它可能是有益看

Rails 3.1 Application Templates from the Rails Apps project on GitHub.

该项目提供的应用程序模板很好的例子加上文件(一定要看看Thor::ActionsRails::Generators::Actions)。

2

详细阐述mu的观点。

<<-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" 

在这种情况下RUBY是,以表示这是红宝石代码(将在评价)。你必须记住,当在字符串中时,#{ruby_code}转义语法将评估给定的ruby_code并将结果插入到字符串中。

因此,要解决这个问题,你可以使用#{}这样做,

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

在这里,我们打出来的字符串,然后用单引号告诉我们不希望#{Rails.root}评估红宝石。

编辑:我会更多地考虑这一点,并意识到这相当于和少许清洁剂

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

这样,我们就不必担心逃避可言:)

+0

也许如果我添加一些上下文。我试图在这里修改应用程序模板: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中拥有指南针支持 – 2011-06-11 03:14:22

+0

我认为这是一个加载顺序问题。尝试将代码放在'config/initializers/sass.rb'而不是'config/sass.rb'中。 – diedthreetimes 2011-06-12 00:11:42

+0

这似乎并不重要,我把它写入或写入文件时都是如此。我试着把它放在一个变量中,发生同样的问题 – 2011-06-12 04:03:46

相关问题