2011-06-10 2 views
1

을 내가 실행할 때 내가레일 응용 프로그램 템플릿 코드를 실행하고 thowing 맞는

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 블록이라고 부르는가? Google에서 검색하기 란 정말 어렵다.) 오류가 발생해서는 안되기 때문에 블록 내부의 코드를 실행하지 않는다는 것이 내 인상이었습니다. 뭐라 구요?

UPDATE : 나를 좀 더 컨텍스트를 추가하자 : 여기 응용 프로그램 템플릿을 수정하기 위해 노력하고있어

: http://metaskills.net/2011/05/18/use-compass-sass-framework-files-with-the-rails-3.1-asset-pipeline/을 그래서 rails3 나침반 지원을 할 수있는 : https://github.com/leshill/rails3-app/blob/master/app.rb 내가이 블로그 게시물에서 코드를 추가 할 수 있습니다. 1

+1

'<< -RUBY' 구조체는 "heredoc"이라고 불리며, Bourne 쉘 (AKA'/ bin/sh')에서 구문이 시작되었습니다 (AFAIK). –

답변

1

당신은 "rails new"명령을 사용하여 파일을 만들고 "heredoc"(<<-SOMESTRING 구문으로 표시됨)을 사용하여 콘텐츠 블록을 전달하도록 요청합니다. 히어 닥에 대한 자세한 : 파서 ​​그냥 쌍 따옴표로 둘러싸인 루비 문자열과 같은 내용을 취급하고 #{}로 둘러싸인 문자열을 대체하려고 시도합니다

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

. Rails.root이라는 변수를 찾을 수 없기 때문에 실패합니다.

single-quote-style-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 3.1 Application Templates from the Rails Apps project on GitHub.

보는 것이 도움이 될 수도 있습니다 더하기 문서 (Thor::ActionsRails::Generators::Actions을보십시오).

2

mu 포인트에 대해 자세히 설명합니다.

<<-SOMESTIRING 구문은 문자열의 시작을 정의합니다. 문자열은

예를 들어 당신이 이것을 RUBY이 루비 코드 (즉 평가됩니다 것을 의미하는 것입니다이 경우 많은

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" 

참조 (라인의 시작) SOMESTRING에 종료). 문자열 내부에 #{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 년 5 월 18 일 레일 - 나일론 - 3.1 - 자산 - 파이프 라인/레일 - 레일에서 나침반을 지원할 수 있도록 사용 - 나침반 - 새시 - 프레임 워크 - 파일 - –

+0

그것은로드 순서 문제라고 생각합니다. 'config/sass.rb' 대신'config/initializers/sass.rb'에 코드를 넣으십시오. – diedthreetimes

+0

어디에 쓰든 상관 없거나 파일에 쓰는 것이 중요하지 않습니다. 변수에 넣으려고했는데 같은 문제가 발생했습니다 –