【问题标题】:How to avoid Rails scaffold to place model into namespace如何避免 Rails 脚手架将模型放入命名空间
【发布时间】:2011-04-16 18:16:06
【问题描述】:

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

rails generate scaffold admin/portfolio

但我只想将控制器和视图放置在管理命名空间中。

我怎样才能避免这种情况?

【问题讨论】:

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


    【解决方案1】:

    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
    

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

    【讨论】:

    • 感谢 mysmallidea,您是如何得知 --model-name 选项的?那是你需要查看源代码的东西,还是在某个地方有文档?
    • 如果您输入rails g scaffold_controller,它将显示该生成器的所有选项。
    • rails g scaffold admin/portfolio 应用一个目录级命名空间admin/、一个Admin::Portfolio 的Ruby 命名空间和一个名为admin_portfolio 的表,而上面的命令(rails g scaffold Admin::Portfolio --model-name=Portfolio)生成相同的目录和文件,但内容不同的是模型没有以admin_为前缀,即使模型仍然命名为Admin::Portfolio
    • 您的解决方案对我帮助很大。谢谢!
    • 您可能需要在控制器中调整一些东西,例如:redirect_to @portfolioredirect_to [:admin, @portfolio]
    【解决方案2】:

    rails generate model Portfolio

    rails generate controller Admin::Portfolios

    【讨论】:

    • 这种情况下脚手架视图如何生成?
    • 当你生成控制器时,它也会创建视图。如果您将操作(例如(索引、显示等))传递给生成控制器命令,它将构建这些特定视图并存根控制器操作。
    • 也可以使用同样使用命名空间模型的scaffold_controller,但在这种情况下不需要修复模型命名空间。
    • 这将生成正确的控制器和模型文件,但这只是脚手架为您生成的一小部分。这可能是达到目的的最佳方式(没有任何宝石),但它不再是脚手架。
    • 要生成脚手架视图,请参阅my answer below
    【解决方案3】:

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

    Nifty Generators 实际上会完全按照您的要求进行操作。只需将其添加到您的 Gemfile:

    gem "nifty-generators"
    

    然后运行:

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

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

    【讨论】:

    • 我的回答假设模型存在。但你是正确的 OP 没有提到这一点!
    【解决方案4】:

    根据@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。

    【讨论】:

    • 这就像管理页面制作强国
    【解决方案5】:

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

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

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

    【讨论】:

    • 但是使用此选项生成的视图将使用错误的 url 助手。使用模型的 url 助手而不是 admin_model 的 url 助手(例如:portfolios_path 而不是 admin_portifolios_path
    • @JonasPorto 是的,你说得对,我手动更改了视图文件。
    • @vidurpunj 不幸的是,是的。现在可能有更好的选择。我已经有一段时间没有使用 Rails了。
    【解决方案6】:

    您可以相当简单地创建自己的生成器,然后对它们做任何您想做的事情:

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

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

    【讨论】:

      【解决方案7】:

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

      【讨论】:

        【解决方案8】:

        最佳解决方案

        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
        

        所以它不会在表格中生成前缀

        【讨论】:

        • 这仍然将模型放在命名空间中
        猜你喜欢
        • 2016-04-06
        • 2016-05-01
        • 2015-03-05
        • 1970-01-01
        • 2012-09-10
        • 2013-03-17
        • 2013-11-24
        • 2017-03-21
        • 1970-01-01
        相关资源
        最近更新 更多