14

不确定我是否没看错,Scaffold 似乎不会完全建立一对多的关系。例如,如果我messages用脚手架创建然后我想要comments那些messages(一个message-> 多个comments),我必须经历并改变一切。例如,我必须在comment'snew视图中更改它

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

对此

<% form_for([@message, @comment]) do |f| %>

然后更改 Action 以设置@messagevar... 除其他外。

目前这不能用 Scaffold 自动完成,对吧?

4

5 回答 5

13

是的。脚手架适用于模型和相关控制器。它不照顾或处理关系。

Scaffold 的主要目标是让 CRUD 使用控制器和相关视图在模型上运行。就这样。任何其他需求(如关系)都必须手动编码。

于 2009-02-02T05:11:12.090 回答
12

这是真的,但是,这不是故事的结局。至少有两种替代 Scaffold 的方法,它们都工作得很好,并且可以自动获取类之间的关系(基于你的 ActiveRecord 关系指标,比如 has_many)。这些替代方案之一是Streamlined,另一个是ActiveScaffold

它们主要有助于输入系统需要的非用户输入数据的数据。例如,我将它们用于表上的管理任务,其中没有必要为 CRUD 构建完整的 UI,而其中一个脚手架替代方案可以很好地完成一项很少使用的功能。不过,您不希望将它们用于对消息的评论。

于 2009-02-05T20:18:43.360 回答
3

请注意,有像Hobo for Rails 这样的项目允许您将字段和关联保留在模型本身中。你不能建立关联,但它非常接近。

您最终会通过在背后构建更多应用程序来为这种糖分付出代价。您通常不是自己滚动,而是从大量预构建的行为中减去您需要的内容。

于 2009-08-12T21:02:10.970 回答
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

还有一个开发者表,它有一个引用 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

我们可以使用脚手架来创建两个表:

$ rails g 脚手架啤酒名称

$ rails g 脚手架开发人员名称 beer_id:integer

脚手架命令为每个模型创建控制器和视图。

我们需要稍微修改一下我们的控制器和视图,以便让下拉菜单为每个开发人员选择一种啤酒:

app/views/developers/_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

编辑控制器的 new 和 edit 方法:

  # 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 操作时要修改哪些文件。

希望有帮助。〜莱克斯

于 2014-09-12T15:38:56.010 回答
1

脚手架是脚手架。当您想要除 CRUD 以外的任何东西时(这是脚手架的作用),您需要更改生成的脚手架代码,或滚动您自己的代码。

于 2009-02-02T13:04:32.227 回答