Доступ к имени приложения из шаблона rails при создании приложения rails - PullRequest
8 голосов
/ 11 марта 2009

Я возиться с шаблонами rails 2.3 и хочу иметь возможность использовать имя приложения в качестве переменной внутри моего шаблона, поэтому, когда я использую ...
rails appname -m path/to/template.rb<br> ... Я хочу иметь доступ к имени приложения внутри template.rb. Кто-нибудь знает, как это сделать?
Спасибо

Ответы [ 9 ]

15 голосов
/ 14 ноября 2010

Я искал ответ на этот вопрос. к сожалению, ответ выше (@root) не работает в Rails 3.

Вот переменные, к которым вы можете получить доступ в шаблонах приложений Rails 3 (еще проще):

@app_name
@app_path
8 голосов
/ 12 марта 2009

Спасибо за ответы. Майк Вудхаус, ты был так близко. Оказывается, все, что вам нужно сделать для доступа к имени приложения из вашего шаблона rails, это ...

@root.split('/').last  

Переменная @root - это первое, что создается при инициализации шаблонов и доступно в ваших шаблонах rails. RAILS_ROOT не работает.

6 голосов
/ 23 апреля 2011

В Rails 3 используйте атрибут app_name.

См. Документацию по Rails :: Generators :: AppGenerator .

5 голосов
/ 10 марта 2015

Я столкнулся с подобной проблемой, ни одна из перечисленных выше переменных не была мне доступна в Rails 4. Я обнаружил, что @name был доступен во время работы

rails plugin new engines/dummy -m my_template.rb

В шаблоне доступны и другие полезные переменные. Вы можете сами убедиться и поиграть, используя pry. Внутри моего шаблона я добавил

require 'pry'; binding.pry

и затем запустил ls, чтобы показать список доступных переменных экземпляра

ls -i
instance variables:
    @_initializer            @app_path  @behavior   @destination_stack  @extra_entries  @name           @output_buffer   @shell
    @_invocations            @args      @builder    @dummy_path         @gem_filter     @options        @rails_template  @source_paths
    @after_bundle_callbacks  @author    @camelized  @email              @in_group       @original_name  @shebang
4 голосов
/ 11 марта 2009

Возможно, есть более простой способ, но, похоже, это работает:

RAILS_ROOT.split('/').last

РЕДАКТИРОВАТЬ: Bleah - это было отклонено один раз, и избиратель был прав. Если бы я прочитал вопрос более внимательно, я бы заметил элементы 2.3 и template.rb. Извинения.

Я подозреваю, что RAILS_ROOT не был создан в тот момент, когда вам нужно имя приложения. Однако, глядя на ruby\lib\ruby\gems\1.8\gems\rails-2.2.2\bin\rails, почти первое, что происходит, это:

app_path = ARGV.first

Он используется в конце скрипта, чтобы позволить chdir и заморозить, если это необходимо - я не знал, что смогу замерзнуть при создании, поэтому я узнал что-то новое, по крайней мере. ARGV тогда привыкаешь здесь:

Rails::Generator::Scripts::Generate.new.run(ARGV, :generator => 'app')

, который быстро доставит нас к месту, где ARGV действительно обрабатывается:

rails-2.3.1\lib\rails_generator\scripts.rb

где я вижу

Rails::Generator::Base.instance(options[:generator], args, options).command(options[:command]).invoke!

Где-то здесь, ниже, вероятно, где обрабатываются шаблоны. Боюсь, я нахожусь на очень ранней стадии с 2.3, и шаблоны - это область, на которую я еще не смотрел.

Это поможет мне лучше, чем мои первые попытки?

1 голос
/ 11 марта 2009

RAILS_ROOT даст вам абсолютный путь к вашему корневому каталогу. Имя вашего приложения будет частью строки после последней '/', которую вы можете получить любым количеством способов.

РЕДАКТИРОВАТЬ: Не совсем достаточно, чтобы сделать работу. Майк и Дэн разглаживают это ниже.

0 голосов
/ 06 февраля 2019

Начиная с Rails 4 (возможно, более ранних версий?), Используйте Rails.application.class, чтобы получить имя приложения. Например, если ваше приложение называется Fizzbuzz, вот несколько способов получить к нему доступ:

rails(development)> Rails.application.class
=> Fizzbuzz::Application
rails(development)> Rails.application.class.name
=> "Fizzbuzz::Application"
rails(development)> Rails.application.class.parent
=> Fizzbuzz
rails(development)> Rails.application.class.parent.to_s
=> "Fizzbuzz"
0 голосов
/ 29 марта 2013

Я получаю ошибку

`template': undefined local variable or method `app_name'

ruby ​​1.9.2p290, рельсы 3.2.11, тор 0.18.0, окна

но с рельсами 2.3 генератор:

class DynanavGenerator < Rails::Generators::Base

(не могу быть уверен, произошла ли эта ошибка при rails 3.0.9 или более ранней) изменилось определение класса:

class DynanavGenerator < Rails::Generators::NamedBase

, который затем дал:

Не указано значение для обязательных аргументов 'name'

Затем я добавил «имя» («что-то» ниже):

rails generate dynanav something --force

, который дал исходную ошибку, поэтому я добавил:

def app_name
  @name.titleize
end

в класс, и все было хорошо.

0 голосов
/ 20 мая 2010

Я считаю, что предпочтительным способом сейчас является вызов Rails.root, а не RAILS_ROOT. Очевидно, кто-то на планетных рельсах испытывает отвращение к заглавным буквам или какой-то другой важной причине Начиная с 2.3.5 они оба работают.

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