【发布时间】:2018-06-26 23:46:11
【问题描述】:
我有一个在迭代器中呈现的 simple_fields_for 表单,如下所示:
<%= simple_form_for @port_stock, url: port_stocks_sell_order_path, method: :post, html: { class: "form-inline" } do |f| %>
<% @buy_port_stocks.each do |port_stock| %>
<%= f.simple_fields_for :closed_positions, html: { class: "form-inline" } do |c| %>
<div class="form-group">
<%= c.input_field :port_stock_id, as: :hidden, value: port_stock.id %>
<%= c.input_field :num_units, id: "sell-ps-#{port_stock.id}", placeholder: "Number of Units", class: "form-control mx-sm-3" %>
<%= c.input_field :closed_price, id: "sale-price-for-ps-#{port_stock.id}", placeholder: "Sale Price", class: "form-control mx-sm-3" %>
</div>
<% end %>
<% end %>
<% end %>
在我的控制器中,我有这个:
@port_stock = current_user.port_stocks.friendly.find(params[:id])
@buy_port_stocks = current_user.port_stocks.buy.joins(:stock).where(stocks: { ticker: @stock.ticker})
@cp = @port_stock.closed_positions.build
我的PortStock.rb 模特:
has_many :closed_positions, dependent: :destroy
accepts_nested_attributes_for :closed_positions, allow_destroy: true
我的ClosedPosition.rb 模特:
class ClosedPosition < ApplicationRecord
belongs_to :closer, class_name: "PortStock", foreign_key: "closer_id"
belongs_to :closed, class_name: "PortStock", foreign_key: "port_stock_id"
end
上述方法非常适用于没有closed_positions 的@port_stock 记录。
例如,该表单呈现如下:
请注意,Number of Units 和 Sale Price 字段在每一行中仅显示一次(这是我所期望的)。
但是,一旦我在任何 PortStock 上创建了一个 closed_position,它就会产生两个问题:
第一期
它将现有的平仓位预先填充为一个字段,然后为closed_positions呈现另一个空白字段,即这样:
我希望它只呈现新表单,而不是重新呈现每行上现有的 closed_position 值。用户不能在此表单中编辑现有的已平仓头寸。
第二期
当有多个平仓时,它会在每一行中呈现错误的仓位。
注意每个渲染的值是如何表示num_units: 100 && price: 8.0,看看这些相同的关闭位置的控制台输出:
=> [#<ClosedPosition:0x00007ff13e77c6d0
id: 9,
closer_id: 2,
port_stock_id: 17,
num_units: 100,
closed_price: 8.0,
ticker: "CAC",
#<ClosedPosition:0x00007ff13e77c2e8
id: 10,
closer_id: 3,
port_stock_id: 18,
num_units: 10,
closed_price: 7.95,
ticker: "CAC",
#<ClosedPosition:0x00007ff13e77c018
id: 11,
closer_id: 10,
port_stock_id: 19,
num_units: 50,
closed_price: 7.9,
ticker: "CAC",
正确的值其实是:
- 数量单位:100 && 价格:8.0
- 数量单位:10 && 价格:7.95
- 数量单位:50 && 价格:7.9
我不明白为什么它为所有 port_stock 对象输出相同的值。
如何解决我的simple_fields_for 表单中的这两个问题?
【问题讨论】:
-
是的,我在嵌套关联模型时总是遇到这个问题。可以
<%= f.simple_fields_for @cp, html: { class: "form-inline" } do |c| %>吗? -
@Chiperific 很棒的想法和建议。所以乍一看似乎解决了它,即它摆脱了重复的字段。但问题是
@cp始终在控制器中声明,它与@port_stock相关,而不是迭代器中的本地port_stock变量。 -
@Chiperific 同样奇怪的是,我现在收到了这个错误:
Unpermitted parameter: :closed_position,尽管我已经在我的强参数中声明了它:params.require(:port_stock).permit(:portfolio_id, :closed_position, closed_positions_attributes: [:num_units, :closer_id, :port_stock_id, :closed_price, :_destroy])。想法? -
@Chiperific 您的建议有效,但我没有从
simple_fields_for表单处理程序中删除:closed_positions,而是将@cp也添加到了表单处理程序中——即<%= f.simple_fields_for :closed_positions, @cp, html: { class: "form-inline" } do |c| %>并且有效.我从另一个 SO question 中得到了这个建议。因此,如果您想将其添加为答案,我会接受。感谢您的建议!
标签: ruby-on-rails ruby-on-rails-5 simple-form accepts-nested-attributes