场合:
所需的最终状态:
当前的hacky解决方案&并发症:
我花了很长时间思考这个问题,并没有想到任何优雅。对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"]
的视图代码片段
<% 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 -->
答案 0 :(得分:0)
<强>验证强>
当你提到你想要同时返回所有错误时,它基本上意味着你需要使用Rails&#39; validations functionality
这会填充@model.errors
对象,您可以在form
上使用此对象:
<% if @model.errors.any? %>
<ul>
<% @model.errors.full_messages.each do |msg| %>
<li><%= msg %></li>
我认为您的问题是您尝试在控制器中使用验证。这是针对MVC principles&amp;通常不利于编程模块化。 validations
功能提供了您需要的功能:
使用inverse_of
创建一些条件验证可能会使您受益;或使用reject_if
<强> reject_if 强>
#app/models/request.rb
Class Request < ActiveRecord::Base
accepts_nested_attributes_for :items, reject_if: proc { |attributes| attributes['an_item_param'].blank? #-> attributes are the "item" attributes }
end
只有在创建请求时才会触发此操作。 I.E如果您的请求由于某种原因(验证问题)失败,则accepts_nested_attributes_for
方法将无法运行,并使用附加的errors
这主要用于验证嵌套资源(除非item
属性已填充等,否则您无法保存title
。
-
<强> inverse_of 强>
#app/models/request.rb
Class Request < ActiveRecord::Base
has_many :items, inverse_of: :request
accepts_nested_attributes_for :items
end
#app/models/item.rb
Class Item < ActiveRecord::Base
belongs_to :request, inverse_of: :items
validates :title, presence: true, unless: :draft?
private
def draft?
self.request.draft #-> an example we've used before :)
end
end
这更适用于特定于模型的验证;允许您确定具体条件。如果我们想要保存草稿等,我们会使用它