Rails 5-has_many:通过nested_form

时间:2018-06-20 19:33:40

标签: ruby-on-rails

我正在尝试创建一个简单的应用程序来记录我们在建设项目中的投标结果。我所有其他模型和视图都在工作,剩下的就是我的最后一部分。最后一部分要求我记录每笔交易的竞争对手出价。我正在尝试使用has_many:through和nested_form完成此操作。这是我的模型和架​​构。我似乎无法弄清楚如何使用嵌套表格来选择公司,他们正在执行的交易以及他们的出价。

bid.rb

class Bid < ApplicationRecord
  has_many :competitors
  has_many :companies, through: :competitors
  accepts_nested_attributes_for :companies, allow_destroy: true
end

company.rb

class Company < ApplicationRecord
   has_many :competitors
   has_many :bids, through: :competitors
end

bid.rb(我的联接表)

class Competitor < ApplicationRecord
   belongs_to :bid
   belongs_to :company
end

schema.rb

create_table "bids", force: :cascade, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8" do |t|
    t.string "name"
    t.string "number"
    t.date "date"
    t.boolean "bond_required"
    t.boolean "performance_bond_required"
    t.string "result"
    t.string "city"
    t.string "county"
    t.string "state"
    t.string "region"
    t.string "union_or_open_shop"
    t.string "owner_pm"
    t.string "bid_day_volume"
    t.string "bid_day_margin"
    t.string "completed_volume"
    t.string "completed_margin"
    t.integer "market_id"
    t.integer "owner_id"
    t.integer "architect_id"
    t.integer "estimator_id"
    t.integer "foreman_id"
    t.integer "project_manager_id"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
    t.integer "public_opening"
  end

  create_table "companies", force: :cascade, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8" do |t|
    t.string "name"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
  end

  create_table "competitors", force: :cascade, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8" do |t|
    t.integer "bid_id"
    t.integer "company_id"
    t.string "trade"
    t.string "bid_amount"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
    t.index ["bid_id", "company_id"], name: "index_competitors_on_bid_id_and_company_id"
  end

这是我的视图的简化版本(我无法弄清楚如何在不破坏视图的情况下添加交易选择或bid_amount)。

<div class="field">
  <%= form.label :name %>
  <%= form.text_field :name, id: :bid_name %>
</div>

<%= nested_form_for @bid do |f| %>
  <%= f.fields_for :companies do |company_form| %>
    <%= company_form.text_field :name %>
    <%= company_form.link_to_remove "Remove this company" %>
  <% end %>
  <p><%= f.link_to_add "Add a company", :companies %></p>
<% end %>

<div class="actions">
  <%= form.submit %>
</div>
<% end %>

当前,如果当nested_form在视图中时单击“提交”,我什至无法发布视图(如果我删除该块,则它可以很好地发布)。感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

根据to another post,您可以通过f.object访问FormBuilder的对象。因此,您应该能够company_form.object.tradecompany_form.object.bid_amount来访问对象属性。

至于表单提交失败,请尝试遵循nested_form_for gem's documentation on Strong Parameters

  

对于Rails 4或使用“ strong_parameters” gem的用户,这是一个示例:

     

params.require(:project).permit(:name,task_attributes:[:id,:name,   :_destroy])

     

:id是为了确保您不会完成很多任务。

     

:_ destroy必须存在,以便我们删除任务。