我有一个带有产品嵌套表单的订单表单。产品正确保存到数据库,但在显示/编辑产品值未加载时 - 字段显示但未填充。
订单型号:
has_many :products, dependent: :destroy
accepts_nested_attributes_for :products
产品型号:
belongs_to :order
orders_controller:
before_action :set_order, only: [:show, :edit]
def new
@order = Order.new
@order.products.build
end
def show
# empty
end
def edit
# empty
end
def order_params
params.require(:order).permit(
:number,
:price,
products_attributes: [
:id,
:type,
:color
])
end
def set_order
if params[:id].present? && user_signed_in?
@order = Order.find(params[:id])
elsif params[:number].present? && params[:email].present?
@order = Order.find_by(number: params[:number], email: params[:email])
else
redirect_to welcome_index_path, alert: I18n.t('views.welcome.index.no_order_found')
end
end
routes.rb中:
resources :orders do
get 'express', on: :new
end
post 'orders/status', to: 'orders#show'
_form.html.erb(由编辑和显示使用):
<%= form_for @order do |f| %>
<%= f.text_field(:number) %>
# etc.
<%= f.fields_for :products do |g| %>
<%= g.text_field(:color) %>
# etc.
<% end %>
<% end %>
答案 0 :(得分:1)
您的代码似乎很好,它应该有效。您能否请尝试以下更改以在表单字段中传递@products
<%= f.fields_for :products, @products do |g| %>
<%= g.text_field(:color) %>
# etc.
<% end %>
只需在@products
和new
操作中提供edit
变量即可。喜欢以下
def new
#your code goes here ...
@products = @order.products.build
end
def edit
#your code goes here ...
@products = @order.products
end
答案 1 :(得分:1)
我终于找到了问题 - 它是在我的自定义FormBuilder类中。我没有将它包含在原始问题中,因为我认为它不相关。我的表单看起来更像是这样:
<%= f.fields_for :products, builder: MyFormBuilder do |g| %>
<%= g.product_select(:color) %>
<%= g.product_checkbox(:accessories) %>
# etc.
<% end %>
MyFormBuilder有以下方法:
def product_select(label)
tags = ''
Product.send(label.to_s.pluralize).each do |a|
tags += @template.content_tag(:option, a[:text], value: a[:value], data: a[:data])
end
tag_with_label(label) do
@template.select(@object_name, label, nil, {}, options) { tags.html_safe }
end
end
def product_checkbox(label)
tag_with_label("#{label.to_s}?") do
@template.check_box(@object_name, label)
end
end
问题在于没有任何内容指定如何为现有对象加载已保存的属性。以下是方法的固定版本:
def product_select(label)
choices = @template.options_for_select(Product.send(label.to_s.pluralize), @object.send(label))
tag_with_label(label) do
@template.select(@object_name, label, choices, {}, options)
end
end
def product_checkbox(label)
tag_with_label("#{label.to_s}?") do
@template.check_box_tag("#{@object_name}[#{label}]", 1, @object.send(label))
end
end
关键部分是@object.send(label)
,它是从数据库中检索适当属性的方法调用。我还更改了Product模型,以options_for_select(一个数组数组)所期望的格式返回一个数组。