【发布时间】:2014-06-26 01:02:49
【问题描述】:
情况:
- 一种允许用户选择多个他们想要请求的项目的表单
- 此表单 POST 到两个模型,一个父模型:请求,子模型:项目。
- 提交后,会创建一个请求,但最多会创建多个项目,具体取决于指定的数量
- 为了处理这个问题,我有两组参数,一组用于项目,一组用于请求
期望的结束状态:
- 我不希望在没有请求的情况下创建项目,也不希望在没有项目的情况下创建请求
- 一旦页面重新呈现,表单中出现的所有错误(无论是没有选择至少一项,还是请求对象的属性中的错误)都会一起显示给用户;即,我想一起做所有的错误检查
当前的 hacky 解决方案和复杂性:
- 目前,我正在分阶段检查,1) 项目中有数量吗?如果不是,那么无论用户可能为 Request 属性设置了什么,页面都会重新呈现(即,Request 的所有属性都将丢失,任何将显示的验证错误也会丢失)。 2)一旦第一阶段通过,模型验证就会启动,如果失败,新页面会再次重新渲染
我已经花了太长时间思考这个问题,但没有想到任何优雅的东西。对 hacky 解决方案感到满意,但更希望得到更聪明的人的见解!
控制器代码(暂时比较胖,稍后会修复)
def create
request_params
@requestrecord = @signup_parent.requests.build
if @itemparams.blank?
@requestrecord.errors[:base] = "Please select at least one item"
render 'new'
else
@requestrecord = @signup_parent.requests.create(@requestparams)
if @requestrecord.save
items_to_be_saved = []
@itemparams.each do |item, quantity|
quantity = quantity.to_i
quantity.times do
items_to_be_saved << ({:request_id => 0, :name => item })
end
end
Item.create items_to_be_saved
flash[:success] = "Thanks!"
redirect_to action: 'success'
else
render 'new'
end
end
end
def request_params
@requestparams = params.require(:request).permit(:detail, :startdate, :enddate)
@itemparams = params["item"]
@itemparams = @transactionparams.first.reject { |k, v| (v == "0") || (v == "")}
end
如果有帮助,生成params["item"]的视图代码的sn-p
<% itemlist.each do |thing| %>
<%= number_field_tag "item[][#{thing}]", :quantity, min: 0, placeholder: 0 %>
<%= label_tag thing %>
</br>
<% end %>
<!-- itemlist is a variable in the controller that is populated with a list of items -->
【问题讨论】:
-
控制器看起来缺少它的一部分。 “items_to_be_saved”从未在任何地方使用,并且数量内的“item_to_be_saved”似乎是一个错字。
-
只是一个快速的错字。固定!
-
您正在构建 items_to_be_saved 但它从未使用过。是否应将 transactions_to_be_saved 替换为 items_to_be_saved?
-
是的,抱歉打字太快了!
标签: ruby-on-rails forms validation ruby-on-rails-4 nested-forms