在rails生成器中检索生成器名称

时间:2016-12-02 22:29:40

标签: ruby-on-rails ruby

我试图设置一个rails生成器,我的第一个,在过去的两个小时里,我一直坚持一些非常简单的事情 - 如何让用户输入生成器的名称。这是在应用程序而不是宝石。

所以在下面的例子中 - 我将如何获得' Foo'在生成器代码上打印?

rails g block Foo

class BlockGenerator < Rails::Generators::NamedBase
  source_root File.expand_path('../templates', __FILE__)

  puts #Foo (file name)#
end

我尝试过使用NamedBase和基础生成器以及我能找到的每种方法。

非常感谢任何帮助!

#编辑
$ rails g block Foo

class BlockGenerator < Rails::Generators::NamedBase
  source_root File.expand_path('../templates', __FILE__)
  argument :generator_name, type: :string

  puts #Foo (file name)#
end

#result

block
No value provided for required arguments 'generator_name'


$ rails generate block :generator_name => testing

 #result

 is empty, nothing is printed to the console. 

1 个答案:

答案 0 :(得分:3)

名称定义为automatically

  

首先,请注意我们继承自Rails :: Generators :: NamedBase   而不是Rails :: Generators :: Base。这意味着我们的发电机   期望至少有一个参数,这个参数将是   初始化程序,将在我们的代码中以变量名称提供。

class BlockGenerator < Rails::Generators::NamedBase
  source_root File.expand_path('../templates', __FILE__)

  def display_name
    puts name
  end
end

这里有效:

rails g block Foo
#=> Foo

如果您需要其他参数:

class BlockGenerator < Rails::Generators::NamedBase
  source_root File.expand_path('../templates', __FILE__)

  argument :bar, type: :string, default: "Bar"

  def display_name
    puts name
    puts bar
  end
end

输出:

rails g block Foo
#Foo
#Bar

rails g block Foo Baz
#Foo
#Baz

请注意,如果您在类定义中使用name变量但在方法之外,则会定义它,但使用BlockGenerator

class BlockGenerator < Rails::Generators::NamedBase
  source_root File.expand_path('../templates', __FILE__)

  argument :bar, type: :string, default: "Bar"

  puts name

  def display_name
    puts name
    puts bar
  end
end


rails g block Foo Baz
# BlockGenerator
# Foo
# Baz