Ruby on rails 如何避免Rails脚手架将模型放置到命名空间中

Ruby on rails 如何避免Rails脚手架将模型放置到命名空间中,ruby-on-rails,ruby-on-rails-3,scaffolding,Ruby On Rails,Ruby On Rails 3,Scaffolding,Rails 3脚手架生成器将模型类放置在名称空间内。 例如: 但我只希望将控制器和视图放置在管理名称空间中 如何避免这种情况?rails生成模型组合 rails生成控制器Admin::公文包根据@tybro0103更新 使用漂亮的:生成器: 如果您已经生成了没有名称空间的模型或脚手架,并且希望再次为管理名称空间生成该模型或脚手架,则可以跳过模型: rails generate nifty:scaffold Admin::Portfolio --skip-model 如果希望脚手架生成包含所有字

Rails 3脚手架生成器将模型类放置在名称空间内。 例如:

但我只希望将控制器和视图放置在管理名称空间中


如何避免这种情况?

rails生成模型组合


rails生成控制器Admin::公文包

根据@tybro0103更新

使用漂亮的:生成器:

如果您已经生成了没有名称空间的模型或脚手架,并且希望再次为管理名称空间生成该模型或脚手架,则可以跳过模型:

rails generate nifty:scaffold Admin::Portfolio --skip-model
如果希望脚手架生成包含所有字段的视图,请重新输入字段名称,例如:

rails generate nifty:scaffold portfolio name:string
rails generate nifty:scaffold Admin::portfolio  name:string --skip-model

我通常会同时执行这两个命令,这样就很容易转到上一个命令并编辑它以添加Admin::&--skip model。

@RubyDev建议Ryan Bate的是正确的,但我不知道他为什么说使用--skip model选项

漂亮的发电机实际上会完全满足你的要求。只需将其添加到您的文件:

gem "nifty-generators"
并运行:

rails g nifty:scaffold Admin::Portfolio name:string

这将创建一个普通脚手架在“admin”名称空间中使用控制器和视图所能创建的一切,但模型不在名称空间中。

漂亮的生成器在不久前是正确的,但现在随着Rails 4的发布,它已经过时了。如果您想使用非名称空间模型生成管理脚手架,您可以使用gem。

您可以非常简单地创建自己的生成器,并使用它们执行任何操作:

在Rails 4中:

#config/application.rb
config.generators do |g|
  g.scaffold_controller :my_controller
end

#lib/generators/rails/my_controller/my_controller\u generator.rb
类Rails::MyControllerGenerator
将删除模型名称空间

请记住,如果您自己生成scaffold\u控制器,则需要显式调用自定义生成器:
rails g my\u controller'account/users'


不幸的是,这只处理控制器。我仍在寻找视图解决方案。

Rails 4生成器有点不同。如果使用scaffold_控制器生成器,它将预构建所有视图文件,但默认情况下,它将查找名为Admin::Portfolio的模型。要加载正确的模型,只需将模型名称作为参数传递给生成器

$ rails g model Portfolio
      invoke  active_record
      create    db/migrate/20150822164921_create_portfolios.rb
      create    app/models/portfolio.rb
      invoke    test_unit
      create      test/models/portfolio_test.rb
      create      test/fixtures/portfolios.yml

$ rails g scaffold_controller Admin::Portfolio --model-name=Portfolio
      create  app/controllers/admin/portfolios_controller.rb
      invoke  haml
      create    app/views/admin/portfolios
      create    app/views/admin/portfolios/index.html.haml
      create    app/views/admin/portfolios/edit.html.haml
      create    app/views/admin/portfolios/show.html.haml
      create    app/views/admin/portfolios/new.html.haml
      create    app/views/admin/portfolios/_form.html.haml
      invoke  test_unit
      create    test/controllers/admin/portfolios_controller_test.rb
      invoke  helper
      create    app/helpers/admin/portfolios_helper.rb
      invoke    test_unit
      invoke  jbuilder
      create    app/views/admin/portfolios
      create    app/views/admin/portfolios/index.json.jbuilder
      create    app/views/admin/portfolios/show.json.jbuilder
这将为您提供一个名称空间控制器和引用非名称空间模型的视图

最佳解决方案

rails generate scaffold admin/theme name:string active:integer position:integer --migration=false

rails generate migration CreateTheme name:string active:integer position:integer
# add t.timestamps in migration

因此它不会在表中生成前缀

您现在可以在Rails上(或至少在5.1上)使用以下命令执行此操作:

rails g scaffold_controller admin/portfolio --model-name=Portfolio

通过指定--model name,Rails不会自动尝试猜测模型名称

在这种情况下如何生成脚手架视图?当您生成控制器时,它也会创建视图。如果您将操作(例如(索引、显示等)传递给generate controller命令,它将生成这些特定视图并清除控制器操作。也可以使用同样使用命名空间模型的scaffold\u controller,但在这种情况下,不需要修复模型命名空间。这将生成正确的控制器和模型文件,但这只是脚手架为你产生的一小部分。这可能是达到目的的最好方法(没有任何gems),但它不再是脚手架。要生成脚手架视图,请参见。这就像管理页面制作Powerhouse我的答案假设模型存在一样。但是你是对的,我没有提到那件事!谢谢你的主意,你是怎么知道--model name选项的?这是您需要查看的源代码,还是有文档?如果键入
rails g scaffold\u controller
,它将显示该生成器的所有选项。
rails g scaffold admin/portfolio
应用目录级名称空间
admin/
,一个Ruby名称空间
admin::portfolio
,和一个名为
admin\u portfolio
的表,而上面的命令(
rails g scaffold admin::portfolio--model name=portfolio
)生成相同的目录和文件,但内容不同,因为模型没有前缀
admin\u
,即使模型的名称空间仍然是
Admin::Portfolio
。您的解决方案对我帮助很大。谢谢您可能需要调整控制器中的一些内容,例如:
重定向到@portfolio
重定向到[:admin,@portfolio]
,但是使用此选项生成的视图将使用错误的url帮助程序。使用模型的url帮助程序而不是管理员模型的url帮助程序(例如:
portfolios\u path
而不是
admin\u portfolios\u path
)@JonasPorto是的,你说得对,我手动更改了视图文件。@vidurpunj不幸的是,是的。现在可能有更好的选择。我已经有一段时间没有使用Rails了。
$ rails g model Portfolio
      invoke  active_record
      create    db/migrate/20150822164921_create_portfolios.rb
      create    app/models/portfolio.rb
      invoke    test_unit
      create      test/models/portfolio_test.rb
      create      test/fixtures/portfolios.yml

$ rails g scaffold_controller Admin::Portfolio --model-name=Portfolio
      create  app/controllers/admin/portfolios_controller.rb
      invoke  haml
      create    app/views/admin/portfolios
      create    app/views/admin/portfolios/index.html.haml
      create    app/views/admin/portfolios/edit.html.haml
      create    app/views/admin/portfolios/show.html.haml
      create    app/views/admin/portfolios/new.html.haml
      create    app/views/admin/portfolios/_form.html.haml
      invoke  test_unit
      create    test/controllers/admin/portfolios_controller_test.rb
      invoke  helper
      create    app/helpers/admin/portfolios_helper.rb
      invoke    test_unit
      invoke  jbuilder
      create    app/views/admin/portfolios
      create    app/views/admin/portfolios/index.json.jbuilder
      create    app/views/admin/portfolios/show.json.jbuilder
rails generate scaffold admin/theme name:string active:integer position:integer --migration=false

rails generate migration CreateTheme name:string active:integer position:integer
# add t.timestamps in migration
rails g scaffold_controller admin/portfolio --model-name=Portfolio