我在SO上看到了几个类似的问题,但它们并没有完全涵盖我的问题。
我有一个带有嵌套字段的非常基本的表单,问题是,当这些嵌套表单中存在任何验证错误时,所有fields_for
字段都会重置为其原始值。
我准备了一个示例超级简单的应用程序来向您展示问题,它的代码可在此处获得:https://github.com/mbajur/wicked-form-reset-example
作为预览,下面是控制器和视图代码:
users_controller.rb
class UsersController < ActionController::Base
def edit
@user = User.find(params[:id])
end
def update
@user = User.find(params[:id])
respond_to do |format|
if @user.update_attributes(params["user"])
format.html { redirect_to edit_user_path(@user), notice: 'User saved.' }
else
format.html { render action: :edit }
end
end
end
end
users/edit.html.erb
<%= form_for @user do |f| %>
<% # ..... %>
<h3>Assets</h3>
<%= f.fields_for :assets, f.object.assets.first_type do |ff| %>
<%= ff.hidden_field :asset_type %>
<%= ff.label :value, 'Asset value:' %>
<br>
<%= ff.text_field :value %>
<% end %>
<% # ..... %>
<hr>
<%= f.submit %>
<% end %>
你能给我一些关于如何处理这个问题的建议吗?
因此,参考您在 GitHub 上提供的模型代码:
class Asset < ActiveRecord::Base
belongs_to :user
attr_accessible :asset_type, :value
scope :first_type, -> { where( asset_type: 1 ) }
scope :second_type, -> { where( asset_type: 2 ) }
scope :third_type, -> { where( asset_type: 3 ) }
validates :value, presence: true, numericality: { only_integer: true }
end
以及您使用的视图:
<%= f.fields_for :assets, f.object.assets.first_type do |ff| %>
<%= ff.hidden_field :asset_type %>
<%= ff.label :value, 'Asset value:' %>
<br>
<%= ff.text_field :value %>
<% end %>
<br><br>
<%= f.fields_for :assets, f.object.assets.second_type do |ff| %>
<%= ff.hidden_field :asset_type %>
<%= ff.label :value, 'Asset value:' %>
<br>
<%= ff.text_field :value %>
<% end %>
<br><br>
<%= f.fields_for :assets, f.object.assets.third_type do |ff| %>
<%= ff.hidden_field :asset_type %>
<%= ff.label :value, 'Asset value:' %>
<br>
<%= ff.text_field :value %>
<% end %>
很明显...使用范围来引用数据。这些将触发数据库查询,以选择由于验证错误而未保留的数据。哒!
因此,如果要处理仍在模型中的数据,则必须使用关联!