3

我在这里看到了几个类似的问题,但它们并没有完全涵盖我的问题。

我有一个带有嵌套字段的非常基本的表单,问题是,当这些嵌套表单中存在任何验证错误时,所有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

用户/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 %>

你能给我一些关于如何处理它的建议吗?

4

1 回答 1

3

因此,参考您在 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 %>

这很明显......您使用范围来引用数据。这些将触发数据库查询以选择由于验证错误而未持久化的数据。太棒了!

因此,如果您想处理仍在模型中的数据,则必须使用关联!

于 2013-10-25T22:21:06.340 回答