Rails:当模型已经存在时,如何运行`rails generate scaffold`?
Posted
技术标签:
【中文标题】Rails:当模型已经存在时,如何运行`rails generate scaffold`?【英文标题】:Rails: How to run `rails generate scaffold` when the model already exists? 【发布时间】:2011-05-19 00:25:12 【问题描述】:我是 Rails 新手,所以我目前的项目处于一种奇怪的状态。
我首先生成的东西之一是“电影”模型。然后我开始更详细地定义它,添加了一些方法等。
我现在意识到我应该使用rails generate scaffold
生成它来连接路由、视图、控制器等内容。
我尝试生成脚手架,但收到错误消息,提示已存在同名的迁移文件。
现在为我的“电影”创建脚手架的最佳方式是什么? (使用导轨 3)
【问题讨论】:
最好自己编写控制器、视图和路由。您将了解有关这些概念的更多信息 同意@penne12。至少在开始时,直到您对这些概念感到满意,以便您知道为您生成的所有代码在做什么。 不直接相关,但如果你搞砸了,请使用 rails destroyTL;DR:rails 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
就是这样。
我希望这会有所帮助
【讨论】:
以上是关于Rails:当模型已经存在时,如何运行`rails generate scaffold`?的主要内容,如果未能解决你的问题,请参考以下文章
如何让模型验证与 Rails 中的视图层对话以提供简单的功能?
如何在记录付款和运行余额的 Rails 模型中避免竞争条件?
当 Rails 中的同一域上存在会话时,如何在 PHP 中创建会话?