【问题标题】:difference between scaffold and model in RailsRails 中脚手架和模型的区别
【发布时间】:2013-07-18 01:08:56
【问题描述】:

在 Rails 中生成脚手架和生成模型有什么区别?两者都有哪些优点/缺点?

【问题讨论】:

    标签: ruby-on-rails model scaffold


    【解决方案1】:

    当您生成模型时,您会得到一个模型以及一些相关组件。我最喜欢的解释此类主题的方法之一是实际尝试或鼓励其他人尝试,所以如果我要在 Rails 项目中输入命令 rails generate model Foo name:string description:text,我会得到:

    invoke  active_record
      create    db/migrate/20130719012107_create_foos.rb
      create    app/models/foo.rb
      invoke    test_unit
      create      test/unit/foo_test.rb
      create      test/fixtures/foos.yml
    

    第一行调用Active Record,它基本上将您的模型与数据库联系起来。下一行创建所谓的迁移文件。迁移文件包含更改数据库的说明。第一个迁移文件创建名为“foos”的数据库表,它还将为“name”和“description”创建列。

    下一行创建模型本身。该模型基本上是一个继承自 Active Record 的 Ruby 类。这意味着可以在 Active Record 中调用的任何方法现在都可以在您的模型中调用。最后三行基本上为您的模型创建相关的测试文件。如果您使用的是 RSpec,则会创建规范文件。

    如果您的 Rails 应用程序只包含模型,那么您将不会有任何类型的视图来显示页面上的信息,也不会有控制信息流的指令。您的选择是同时生成控制器(进而生成您的视图)或生成一个脚手架,该脚手架生成您的模型、视图、控制器并写入您的 routes.rb 文件。如果我运行rails generate scaffold foo,我会得到:

    invoke  active_record
      create    db/migrate/20130719013307_create_foos.rb
      create    app/models/foo.rb
      invoke    test_unit
      create      test/unit/foo_test.rb
      create      test/fixtures/foos.yml
      invoke  resource_route
       route    resources :foos
      invoke  scaffold_controller
      create    app/controllers/foos_controller.rb
      invoke    erb
      create      app/views/foos
      create      app/views/foos/index.html.erb
      create      app/views/foos/edit.html.erb
      create      app/views/foos/show.html.erb
      create      app/views/foos/new.html.erb
      create      app/views/foos/_form.html.erb
      invoke    test_unit
      create      test/functional/foos_controller_test.rb
      invoke    helper
      create      app/helpers/foos_helper.rb
      invoke      test_unit
      create        test/unit/helpers/foos_helper_test.rb
      invoke  assets
      invoke    coffee
      create      app/assets/javascripts/foos.js.coffee
      invoke    scss
      create      app/assets/stylesheets/foos.css.scss
      invoke  scss
     identical    app/assets/stylesheets/scaffolds.css.scss
    

    为了回答您的问题,脚手架的优势在于它快速、简单,并且一切都为您预先配置好了。然而,独立于脚手架生成模型(然后在需要的地方生成控制器/视图并自己编写 routes.rb 文件)的优点是您可以更好地控制应用程序及其外观和功能,避免不必要的代码,您可以使用行为驱动开发或测试驱动开发,以及可能其他人可能想要添加的其他东西。

    我的最后一点建议是:Rails 对用户非常友好,因此请尝试自己尝试。您可以使用相应的destroy 命令撤消任何generate 命令,例如rails destroy scaffold Foo 将删除rails generate Scaffold Foo name:string description:string 生成的所有文件,因此您不必担心通过试验不可避免地搞砸项目。

    【讨论】:

    • 我还应该鼓励您阅读有关这些主题的任何官方 Rails 指南...我提供了 Active Record 和迁移等内容的高级概述,但希望足以回答你的问题!
    • 惊人的答案非常感谢你,你帮了我很多
    • 我也有同样的问题。很好的解释。谢谢。
    • 不知道撤销!谢谢你让我知道! +1
    【解决方案2】:

    生成脚手架包括生成模型但也生成

    • RESTful 路由
    • 一个控制器,包含模型的 RESTful 处理的所有操作
    • 控制器需要的视图
    • 测试存根

    脚手架对于 Rails 新用户来说是一个好的开始。

    【讨论】:

      【解决方案3】:

      $rails generate scaffold <name>
      

      您可以使用完整的 CRUD(创建、读取、更新、删除)Web 界面自动生成随时可用的控制器、模型和视图。它比生成模型更容易和更快,但它生成的代码不太适合您的应用程序。

      scaffold 非常适合用于简单示例、快速模型或测试。

      如果您在已经生成模型后改变主意并决定使用脚手架,您可以随时运行

      $rails generate scaffold <name>
      

      它将创建所有丢失的文件。或者如果您对使用脚手架不满意,您可以随时通过以下方式将其移除:

      生成脚手架:

      $rails generate scaffold Story
      

      如果您迁移了文件,请执行回滚:

      $rake db:rollback
      

      销毁或撤消脚手架:$rails 销毁脚手架故事

      【讨论】:

        【解决方案4】:

        新用户很可能会对脚手架感到困惑,因为他们不了解所有组件如何协同工作。脚手架可能最适合有经验的用户,他们想要一个他们通常会重复的工作的捷径。

        【讨论】:

          猜你喜欢
          • 2011-10-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-04-06
          • 1970-01-01
          • 2012-03-27
          • 1970-01-01
          • 2020-05-16
          相关资源
          最近更新 更多