2011-06-10 20 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

相關問題