如何避免Rails脚手架将模型放入命名空间

时间:2010-09-24 12:12:16

标签: ruby-on-rails ruby-on-rails-3 scaffolding

Rails 3 scaffold生成器在命名空间内放置模型类。 例如:

rails generate scaffold admin/portfolio

但我想只将控制器和视图放在admin命名空间内。

我该如何避免?

此致 Alexey Zakharov。

8 个答案:

答案 0 :(得分:33)

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

这将为您提供一个命名空间控制器和引用非命名空间模型的视图。

答案 1 :(得分:23)

rails generate model Portfolio

rails generate controller Admin::Portfolios

答案 2 :(得分:7)

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

Nifty Generators实际上会完全你所要求的。只需将其添加到您的Gemfile:

gem "nifty-generators"

并运行:

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

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

答案 3 :(得分:5)

根据@ 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模型

答案 4 :(得分:1)

Nifty生成器在前一段时间是正确的,但现在随着Rails 4的发布,它已经过时了。如果要使用非命名空间模型生成管理脚手架,可以使用rails-admin-scaffold gem。

答案 5 :(得分:1)

您可以相当简单地创建自己的生成器并随心所欲地执行任何操作:

在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'

不幸的是,这仅处理控制器。我还在寻找一个视图解决方案。

答案 6 :(得分:1)

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

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

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

答案 7 :(得分:0)

最佳解决方案

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

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