Ruby on rails Rails:自动执行一对多关系的脚手架

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自

我不确定我的阅读是否正确,但脚手架似乎不能完全实现一对多的关系。例如,如果我用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