不确定我是否正确阅读this,但似乎Scaffold不会完整地建立一对多的关系。例如,如果我使用scaffold创建messages
,然后我希望comments
messages
(一个message
- >多个comments
),我必须经历并改变一切。例如,我必须在comment
的{{1}}视图
new
到这个
<% form_for(@comment) do |f| %>
然后更改操作以设置<% form_for([@message, @comment]) do |f| %>
var ...等等。
目前无法使用Scaffold自动完成,对吧?
答案 0 :(得分:13)
是。脚手架适用于模型和相关控制器。它没有照顾或处理关系。
Scaffold的主要目标是使用控制器和相关视图让CRUD进入模型。就这样。任何其他要求,如关系必须手动编码。
答案 1 :(得分:12)
这是事实,但是,这不是故事的结局。 Scaffold至少有两种选择,它们都能很好地工作并自动获取类之间的关系(基于你的ActiveRecord关系指标,如has_many)。其中一个替代方案是Streamlined,另一个是ActiveScaffold。
它们主要用于输入系统所需的非用户输入数据的数据。例如,我将它们用于表格上的管理任务,当其中一个脚手架替代品能够很好地用于很少使用的功能时,没有必要为CRUD构建完整的UI。您不希望将它们用于对消息的评论。
答案 2 :(得分:3)
请注意,Rails等项目有Hobo,可让您在模型中保留字段和关联。你不能支持关联,但它非常接近。
你最后通过在背后建立了更多的应用程序来支付这种糖。你通常会从一大堆预建行为中减去你需要的东西,而不是自己动手。
答案 3 :(得分:2)
您不需要繁重的rails管理框架来实现一对多关系。
您可以使用脚手架来完成大部分工作。
在控制器和_form视图中再做一些工作可以让你完成剩下的工作。
以下是......
Story: Select a beer for a developer
In order to select a beer for a developer
As an admin
I want a mainly scaffolded interface to select that beer
Scenario 1: Select beer for new developer
Given I have clicked the <new> button and entered the developer's name
When I click the beer dropdown
Then I should be presented with a list of beers to choose from
And that beer will be saved when I click <ok>
Scenario 2: Select a different beer for existing developer
Given I have clicked the <edit> button on the index page for a particular developer
When I click the beer dropdown
Then I should be presented with a list of beers to choose from
And that beer will be saved when I click <ok>
假设我们有一个啤酒表:
create_table "beers", force: true do |t|
t.string "name"
t.datetime "created_at"
t.datetime "updated_at"
end
一个开发人员表,其中有一个引用啤酒表的外键(beer_id):
create_table "developers", force: true do |t|
t.string "name"
t.integer "beer_id"
t.datetime "created_at"
t.datetime "updated_at"
end
我们可以使用scaffolding来创建两个表:
$ rails g脚手架啤酒名称
$ rails g scaffold开发者名称beer_id:整数
scaffold命令为每个模型创建控制器和视图。
我们需要稍微修改我们的控制器和视图以获得下拉菜单,为每个开发人员选择啤酒:
应用/视图/开发者/ _form.html.erb 强>
使用以下内容替换生成的text_field和beer_id标签:
<div class="field">
<%= f.label :beer_id %><br />
<%= collection_select(:developer, :beer_id, @beers, :id, :name, {:prompt => false}) %>
</div>
应用/控制器/ developer_controller.rb 强>
编辑控制器的新方法和编辑方法:
# GET /developers/new
def new
@developer = Developer.new
@beers = Beer.all
respond_to do |format|
format.html # new.html.erb
end
end
# GET /developers/1/edit
def edit
@beers = Beer.all
respond_to do |format|
format.html # new.html.erb
end
end
屏幕截图
备注强>
Rails脚手架很棒。查看它为您创建的所有文件:
$ be rails g scaffold beer name
invoke active_record
create db/migrate/20140912144218_create_beers.rb
create app/models/beer.rb
invoke rspec
create spec/models/beer_spec.rb
invoke factory_girl
create spec/factories/beers.rb
invoke resource_route
route resources :beers
invoke scaffold_controller
create app/controllers/beers_controller.rb
invoke erb
create app/views/beers
create app/views/beers/index.html.erb
create app/views/beers/edit.html.erb
create app/views/beers/show.html.erb
create app/views/beers/new.html.erb
create app/views/beers/_form.html.erb
invoke rspec
create spec/controllers/beers_controller_spec.rb
create spec/views/beers/edit.html.erb_spec.rb
create spec/views/beers/index.html.erb_spec.rb
create spec/views/beers/new.html.erb_spec.rb
create spec/views/beers/show.html.erb_spec.rb
create spec/routing/beers_routing_spec.rb
invoke rspec
create spec/requests/beers_spec.rb
invoke helper
create app/helpers/beers_helper.rb
invoke rspec
create spec/helpers/beers_helper_spec.rb
invoke jbuilder
create app/views/beers/index.json.jbuilder
create app/views/beers/show.json.jbuilder
invoke assets
invoke coffee
create app/assets/javascripts/beers.js.coffee
invoke scss
create app/assets/stylesheets/beers.css.scss
invoke scss
create app/assets/stylesheets/scaffolds.css.scss
当您需要更多基本CRUD操作时,您所要做的就是知道要修改哪些文件。
希望有所帮助。 ~Lex
答案 4 :(得分:1)
支架是支架。如果你想要一个桌子上的CRUD以外的任何东西(这是一个脚手架/是什么),你需要改变生成的脚手架代码,或者自己动手。