Rails:脚手架自动执行一对多关系

时间:2009-02-02 03:37:28

标签: ruby-on-rails foreign-key-relationship scaffold

不确定我是否正确阅读this,但似乎Scaffold不会完整地建立一对多的关系。例如,如果我使用scaffold创建messages,然后我希望comments messages(一个message - >多个comments),我必须经历并改变一切。例如,我必须在comment的{​​{1}}视图

中更改此设置
new

到这个

<% form_for(@comment) do |f| %>

然后更改操作以设置<% form_for([@message, @comment]) do |f| %> var ...等等。

目前无法使用Scaffold自动完成,对吧?

5 个答案:

答案 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

屏幕截图

enter image description here

enter image description here

enter image description here

备注

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以外的任何东西(这是一个脚手架/是什么),你需要改变生成的脚手架代码,或者自己动手。