Шаблон приложения Rails запускает код и подходит - PullRequest
1 голос
/ 11 июня 2011

Я пытаюсь создать шаблон приложения на 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? Это действительно трудно найти в Google). У меня сложилось впечатление, что он не будет выполнять какой-либо код внутри блока, поэтому он не должен вызывать ошибок. Что дает? </p>

ОБНОВЛЕНИЕ: Позвольте мне добавить еще немного контекста:

Я пытаюсь изменить шаблон приложения здесь: 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

Ответы [ 2 ]

2 голосов
/ 11 июня 2011

Чтобы уточнить точку зрения мю.

Синтаксис <<-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 означает, что это код рубина (который будет оцениваться). Вы должны помнить, что когда внутри строки, escape-синтаксис #{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"

Таким образом, нам вообще не нужно беспокоиться о побеге:)

1 голос
/ 23 июня 2011

Вы просите команду "rails new" создать файл и передать блок содержимого с использованием "heredoc" (сигнализируется синтаксисом <<-SOMESTRING). Подробнее о heredoc:

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

Парсер будет обрабатывать содержимое как строку Ruby, заключенную в двойные кавычки, и попытаться заменить любую строку, заключенную в #{}. Сбой из-за невозможности найти переменную с именем Rails.root.

Вы можете избежать поведения замещения (обработайте содержимое как строку Ruby, заключенную в одинарные кавычки), используя одинарный-quote-style-heredoc. Окружите сигнал heredoc одинарными кавычками:

файл 'config / sass.rb', << - 'RUBY' </p>

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" конец </p>

RUBY

Поскольку вы создаете шаблон приложения Rails для начального приложения, может быть полезно взглянуть на

Rails 3.1 Шаблоны приложений из проекта Rails Apps на GitHub.

В проекте представлены хорошие примеры шаблонов приложений плюс документация (обязательно посмотрите Thor :: Actions и Rails :: Generators :: Actions ).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...