Ruby on rails 如何避免Rails脚手架将模型放置到命名空间中
Rails 3脚手架生成器将模型类放置在名称空间内。 例如: 但我只希望将控制器和视图放置在管理名称空间中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生成模型组合
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