我试图设置一个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.
答案 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