Rails 3 脚手架生成器将模型类放在命名空间内。例子:
rails generate scaffold admin/portfolio
但我只想将控制器和视图放置在管理命名空间中。
我怎样才能避免这种情况?
Rails 3 脚手架生成器将模型类放在命名空间内。例子:
rails generate scaffold admin/portfolio
但我只想将控制器和视图放置在管理命名空间中。
我怎样才能避免这种情况?
Rails 4 生成器有点不同。如果您使用scaffold_controller 生成器,它将预先构建所有视图文件,但默认情况下它会查找名为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 model Portfolio
rails generate controller Admin::Portfolios
@RubyDev 建议 Ryan Bate 的Nifty Generators是正确的,但我不知道他为什么说要使用 --skip-model 选项。
Nifty Generators 实际上会完全满足您的要求。只需将其添加到您的 Gemfile 中:
gem "nifty-generators"
并运行:
rails g nifty:scaffold Admin::Portfolio name:string
这将创建一个普通脚手架在“管理”命名空间中使用控制器和视图的所有内容,但模型不在命名空间中。
根据@tybro0103 更新
使用 nifty:generators:https ://github.com/ryanb/nifty-generators
rails generate nifty:scaffold Admin::Portfolio
如果您已经生成了没有命名空间的模型或脚手架,并且想为 admin 命名空间再次生成,您可以跳过模型:
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。
您现在可以使用以下命令在 Rails(或至少在 5.1 上)上执行此操作:
rails g scaffold_controller admin/portfolio --model-name=Portfolio
通过指定 --model-name Rails 不会自动尝试猜测模型名称。
您可以相当简单地创建自己的生成器,然后对它们做任何您想做的事情:
在 Rails 4 中:
#config/application.rb
config.generators do |g|
g.scaffold_controller :my_controller
end
和
#lib/generators/rails/my_controller/my_controller_generator.rb
class Rails::MyControllerGenerator < Rails::Generators::ScaffoldControllerGenerator
def class_name
([file_name]).map!{ |m| m.camelize }.join('::')
end
def table_name
@table_name ||= begin
base = pluralize_table_names? ? plural_name : singular_name
([base]).join('_')
end
end
end
将删除模型命名空间。
请记住,如果您自己生成一个scaffold_controller,您需要显式调用您的自定义生成器:rails g my_controller 'account/users'
不幸的是,这只处理控制器。我仍在寻找视图解决方案。
漂亮的生成器在前一段时间是正确的,但现在随着 Rails 4 的发布,它变得过时了。如果要使用非命名空间模型生成管理脚手架,可以使用rails-admin-scaffold gem。
最佳解决方案
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
所以它不会在表中生成前缀