我正在尝试创建一个简单的应用程序来记录我们在建设项目中的投标结果。我所有其他模型和视图都在工作,剩下的就是我的最后一部分。最后一部分要求我记录每笔交易的竞争对手出价。我正在尝试使用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在视图中时单击“提交”,我什至无法发布视图(如果我删除该块,则它可以很好地发布)。感谢您的帮助!
答案 0 :(得分:0)
根据to another post,您可以通过f.object
访问FormBuilder的对象。因此,您应该能够company_form.object.trade
和company_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必须存在,以便我们删除任务。