【问题标题】:Rails: Scaffold to automatically do one-to-many relationshipRails:脚手架自动做一对多关系
【发布时间】:2010-10-04 20:46:55
【问题描述】:

不确定我是否在阅读 this 正确,但似乎 Scaffold 不会完全建立一对多的关系。例如,如果我用脚手架创建messages,然后我想在那些messages 上使用comments(一个message -> 许多comments),我必须经历并改变一切。例如,我必须在commentnew 视图中更改它

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

到这里

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

然后更改 Action 以设置 @message var... 等等。

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

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

    • 优秀。它仍然节省了相当多的工作......我想象/梦想在未来它也会建立关系。
    • 是的。我想象一个应用程序可以通过拖放和最少的配置编写一个 Rails 应用程序。它会发生。很快! :)
    • 现在有什么变化吗?
    【解决方案2】:

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

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

    【讨论】:

    【解决方案3】:

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

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

    【讨论】:

    • 酷,谢谢,我去看看。现在我从来没有使用过 Scaffold,但我什至在使用 REST 的东西很多......
    【解决方案4】:

    您不需要繁重的 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>
    

    假设我们有一个 beers 表:

      create_table "beers", force: true do |t|
        t.string   "name"
        t.datetime "created_at"
        t.datetime "updated_at"
      end
    

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

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

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

    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>
    

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

    希望对您有所帮助。 ~ 莱克斯

    【讨论】:

      【解决方案5】:

      脚手架是脚手架。当您想要在表上添加除 CRUD 以外的任何内容(这是脚手架的作用)时,您需要更改生成的脚手架代码,或者自己滚动。

      【讨论】:

      • 谢谢。我想停止滚动,但在 2009 年仍然是自己滚动。
      猜你喜欢
      • 2012-05-22
      • 1970-01-01
      • 2015-01-08
      • 1970-01-01
      • 2022-01-25
      • 1970-01-01
      • 2012-06-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多