【问题标题】:Rails: How to run `rails generate scaffold` when the model already exists?Rails:当模型已经存在时,如何运行`rails generate scaffold`?
【发布时间】:2011-05-19 00:25:12
【问题描述】:

我是 Rails 新手,所以我目前的项目处于一种奇怪的状态。

我首先生成的东西之一是“电影”模型。然后我开始更详细地定义它,添加了一些方法等。

我现在意识到我应该使用rails generate scaffold 生成它来连接路由、视图、控制器等内容。

我尝试生成脚手架,但收到错误消息,提示已存在同名的迁移文件。

现在为我的“电影”创建脚手架的最佳方式是什么? (使用导轨 3)

【问题讨论】:

  • 最好自己编写控制器、视图和路由。您将了解有关这些概念的更多信息
  • 同意@penne12。至少在开始时,直到您对这些概念感到满意,以便您知道为您生成的所有代码在做什么。
  • 不直接相关,但如果你搞砸了,请使用 rails destroy 。我记得这在我开始时非常有用。
  • @BenAubin,尽管如此,Rails 的美妙之处在于不必不断编写样板文件。

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


【解决方案1】:

TL;DRrails g scaffold_controller <name>

即使您已经有了模型,您仍然可以使用rails generate 选项生成必要的控制器和迁移文件。如果您运行rails generate -h,您可以看到所有可用的选项。

Rails:
  controller
  generator
  helper
  integration_test
  mailer
  migration
  model
  observer
  performance_test
  plugin
  resource
  scaffold
  scaffold_controller
  session_migration
  stylesheets

如果您想为您的模型生成控制器脚手架,请参阅scaffold_controller。为清楚起见,以下是对此的描述:

存根一个脚手架控制器及其视图。传递模型名称, CamelCased 或 under_scored,以及作为参数的视图列表。 控制器名称被检索为模型的复数版本 名字。

要在模块中创建控制器,请将模型名称指定为 'parent_module/controller_name' 之类的路径。

这会在 app/controllers 中生成一个控制器类并调用 helper, 模板引擎和测试框架生成器。

要创建资源,您可以使用 resource 生成器,要创建迁移,您还可以查看 migration 生成器(请参阅,所有这些疯狂都有一个模式)。这些提供了创建缺失文件以构建资源的选项。或者,您可以使用 --skip 选项运行 rails generate scaffold 以跳过任何存在的文件:)

我建议花一些时间查看生成器内部的选项。我不觉得它们在书籍等中的记录非常好,但它们非常方便。

【讨论】:

  • 哇,这是我对编程问题的最佳回答之一。谢谢!
  • 我也有现有的模型,rails generate scaffold_controller MyModel 确实会生成视图层,但它不包括模型属性(表列),您必须手动添加这些属性。有人知道解决这个问题吗?我在 Rails 3.2.8 上。
  • @aaronbartell 您要求 Rails 生成一个不关心模型属性的“scaffold_controller”。这并没有破坏,如果您也想要生成模型,那么您想要 generate scaffold 如果您有模型但您想要一个脚手架控制器并将新属性添加到您想要的模型 scaffold_generator 后跟 migration 与您的字段'正在改变
  • @Lee - 没有 aaronbartell 询问为什么脚手架控制器不为传递给它的模型的现有属性生成相应的视图输入,这是一个有效的问题...@987654321 @
【解决方案2】:

Lee Jarvis 的回答很好,这只是命令,例如;我们已经有一个名为 User 的现有模型:

rails g scaffold_controller User

【讨论】:

  • 感谢我们这些懒得看文字段落的人!
【解决方案3】:

对于那些使用现有数据库启动 Rails 应用程序的人,有一个很酷的 gem 叫做 schema_to_scaffold 来生成一个脚手架脚本。 它输出:

rails g scaffold users fname:string lname:string bdate:date email:string encrypted_password:string

来自你的schema.rb我们你改名的schema.rb.Check it

【讨论】:

  • 这是一个很棒的小宝石,对我有很大帮助!应该内置在 Rails 中!
【解决方案4】:

Rails 5 中,您仍然可以运行

$rails generate scaffold movie --skip

创建所有缺少的脚手架文件或

rails generate scaffold_controller Movie

仅创建控制器和视图。

如需更好的解释,请查看rails scaffold

【讨论】:

    【解决方案5】:

    这个命令应该可以解决问题:

    $ rails g scaffold movie --skip
    

    【讨论】:

      【解决方案6】:

      你可以使用scaffold_controller并记得传递模型的attributes,否则会生成没有属性的脚手架。

      rails g scaffold_controller User name email
      # or
      rails g scaffold_controller User name:string email:string
      

      此命令将生成以下文件:

      create  app/controllers/users_controller.rb
      invoke  haml
      create    app/views/users
      create    app/views/users/index.html.haml
      create    app/views/users/edit.html.haml
      create    app/views/users/show.html.haml
      create    app/views/users/new.html.haml
      create    app/views/users/_form.html.haml
      invoke  test_unit
      create    test/controllers/users_controller_test.rb
      invoke  helper
      create    app/helpers/users_helper.rb
      invoke    test_unit
      invoke  jbuilder
      create    app/views/users/index.json.jbuilder
      create    app/views/users/show.json.jbuilder
      

      【讨论】:

        【解决方案7】:

        我在 Ubuntu 20.04 中开发 Rails 6 API 应用程序时遇到了这个挑战。

        我已经有了现有的模型,我需要为模型生成相应的控制器,并在中添加它们的允许的属性 >控制器参数

        我是这样做的

        我使用rails generate scaffold_controller 来完成它。

        我只是运行了以下命令:

        rails generate scaffold_controller School name:string logo:json motto:text address:text
        
        rails generate scaffold_controller Program name:string logo:json school:references
        

        这为模型生成了相应的控制器,并在控制器参数中添加了它们的允许的属性,包括外键属性。

        create  app/controllers/schools_controller.rb
        invoke  test_unit
        create    test/controllers/schools_controller_test.rb
        
        create  app/controllers/programs_controller.rb
        invoke  test_unit
        create    test/controllers/programs_controller_test.rb
        

        就是这样。

        我希望这会有所帮助

        【讨论】:

          猜你喜欢
          • 2014-01-24
          • 1970-01-01
          • 2019-04-06
          • 1970-01-01
          • 2020-10-13
          • 2016-07-30
          • 2014-06-10
          • 2013-02-10
          • 1970-01-01
          相关资源
          最近更新 更多