Ruby on rails Rails:自动执行一对多关系的脚手架
我不确定我的阅读是否正确,但脚手架似乎不能完全实现一对多的关系。例如,如果我用scaffold创建Ruby on rails Rails:自动执行一对多关系的脚手架,ruby-on-rails,foreign-key-relationship,scaffold,Ruby On Rails,Foreign Key Relationship,Scaffold,我不确定我的阅读是否正确,但脚手架似乎不能完全实现一对多的关系。例如,如果我用scaffold创建消息,然后我想对那些消息(一条消息->多条评论)发表评论,我必须仔细检查并更改所有内容。例如,我必须在注释的新建视图中对此进行更改 <% form_for(@comment) do |f| %> 对此 <% form_for([@message, @comment]) do |f| %> 然后更改操作以设置@消息变量。。。除其他外 这目前无法使用Scaffold自
消息
,然后我想对那些消息
(一条消息
->多条评论
)发表评论,我必须仔细检查并更改所有内容。例如,我必须在注释
的新建
视图中对此进行更改
<% form_for(@comment) do |f| %>
对此
<% form_for([@message, @comment]) do |f| %>
然后更改操作以设置@消息
变量。。。除其他外
这目前无法使用Scaffold自动完成,对吗?是。脚手架适用于模型和相关控制器。它不关心或处理人际关系
Scaffold的主要目标是使用控制器和相关视图使CRUD在模型上运行。这就是全部。任何其他需求,如关系,都必须手动编码。脚手架就是脚手架。当你想在一张桌子上放置积垢以外的任何东西时(脚手架就是这样做的),你需要修改生成的脚手架代码,或者你自己滚。这是真的,但是,故事还没有结束。对于Scaffold,至少有两种方法可以很好地工作,并且可以自动获取类之间的关系(基于您的ActiveRecord关系指示器,如has\u many)。其中一个是,另一个是
它们主要有助于输入系统需要的数据,而不是用户输入的数据。例如,我将它们用于表上的管理任务,在这些表中,为CRUD构建一个完整的UI毫无意义,而脚手架替代方案中的一个对于一个很少使用的特性来说可以很好地完成这项工作。不过,您不想将它们用于对消息的评论。请注意,有一些类似于for Rails的项目允许您在模型本身中保留字段和关联。你不能用脚手架搭建联想,但它非常接近
你最终会在背后构建更多的应用程序,从而为这种糖买单。你通常从大量的预先构建的行为中减去你需要的,而不是你自己的行为。你不需要一个繁重的rails管理框架来让一对多的关系正常工作
你可以用脚手架把大部分的路都搭上去
在controller和_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>
以及一个开发人员表,该表具有引用beers表的外键(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
我们可以使用脚手架创建两个表:
$g脚手架啤酒名称
$rails g scaffold开发者名称beer\u id:integer
scaffold命令为每个模型创建控制器和视图
我们需要稍微修改控制器和视图,以获得下拉菜单,为每个开发人员选择啤酒:
app/views/developers/_-form.html.erb
将生成的文本字段和啤酒id标签替换为以下内容:
<div class="field">
<%= f.label :beer_id %><br />
<%= collection_select(:developer, :beer_id, @beers, :id, :name, {:prompt => false}) %>
</div>
屏幕截图
注释
栏杆脚手架很棒。查看它为您创建的所有文件:
$ 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好极了。它仍然节省了相当多的工作。。。我想象/梦想在未来它也能处理人际关系。我想象一个应用程序可以编写一个带有拖放和最小配置的rails应用程序。这会发生的。很快!:)现在有什么变化吗?谢谢。我想停止滚动,但在2009年,它仍然是所有关于滚动自己的。酷,谢谢你,我会看看它。现在我从来没有使用过脚手架,但我甚至使用了很多其他的东西…为了一大堆可能的选择:
# 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
$ 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