【问题标题】:rails fields_for does not render after validation error on nested formrails fields_for 在嵌套表单上的验证错误后不呈现
【发布时间】:2010-08-31 17:23:39
【问题描述】:

我遇到了嵌套表单问题。我从 railscasts 196 和 197 实现了嵌套表单解决方案。如果我没有验证错误,它就可以工作。

因此,表单在加载时会完美呈现,包括嵌套字段(在 fields_for 部分中)。

但是,表单有验证。当验证失败时,控制器会渲染 :new。然后表单呈现链接模型字段正常,但不再呈现嵌套字段。有解决办法吗?

控制器

  def new
    @property = Property.new
    @property.images.build
  end

  def create
    @property = Property.new(params[:property])
    if @property.save
      flash[:success] = t('Your_property') + ' ' + t('is_successfully_created')
      redirect_to myimmonatie_url
    else
      render :action => 'new'
    end
  end

部分视图:

<% form_for :property, @property, :url => { :action => "create" }, :html => { :multipart => true } do |f| %>
  <div id="new-property-form-spannedcols">
      <div class="formField inptRequired">
        <%= f.label :postal_code, t("Postal_code") %>
        <%= f.text_field :postal_code, :class => 'inptMedium short' %>
      </div>
      <div id="city_row" class="formField inptRequired">
        <%= f.label :city, t("City") %>
        <div id="city_cell">
          <%= render :partial => 'ajax/cities', :locals => { :postal_code => @property.postal_code } %>
        </div>
      </div>

      ...

      <% f.fields_for :images do |builder| %>
        <div class="formField">
          <%= builder.label :photo, t("Photo_path_max_3mb") %>
          <%= builder.file_field :photo, :class => 'inptMedium' %>
          <%= builder.hidden_field :order, :value => "1" %>
        </div>
      <% end %>
  </div> <!-- /new-property-form-spannedcols -->
  <div class="formBtn">
    <%= f.submit t("Save"), :class => 'btnMedium bg-img-home' %>&nbsp;
  </div> <!-- /formBtn -->
<%- end -%>

【问题讨论】:

    标签: ruby-on-rails


    【解决方案1】:

    它会抛出错误吗?

    我的猜测是您的问题是在您的 new 操作中,您正在执行 @property.images.build,这不在您的编辑操作中。当验证失败时,它将呈现您的新操作,但不会运行您的新操作。您可以尝试将 @property.images.build 放在 create 操作的 else 子句中,例如:

    else
      @property.images.build
      render :action => 'new'
    end
    

    无论如何,这不是最干净的方法,但这将有助于追踪是否是您的问题。

    【讨论】:

    • 嗨,它不会抛出错误,只是没有渲染,日志中也没有错误。是的,您的解决方案有效! :) 谢谢
    【解决方案2】:

    我也遇到了同样的问题。由于我看不到你的模型,我猜你有 :reject_if => :all_blank 或其他一些 lambda。这似乎是罪魁祸首,虽然我没有解决办法。我会将此作为评论而不是答案,但显然我没有足够的声誉来做这样的事情。

    【讨论】:

      【解决方案3】:

      此时,我发现解决它的唯一方法是覆盖 create 方法。

       def new
          @property = Property.new
          @property.images.build
        end
      
        def create
          @property = Property.new(params[:property])
          if @property.save
            flash[:success] = t('Your_property') + ' ' + t('is_successfully_created')
            redirect_to myimmonatie_url
          else
            @property.images.build if @property.images.blank? ##because i'm shure you have something similar to : accepts_nested_attributes_for :images,      :reject_if => lambda { |fields| fields[:image].blank? }
            render :action => 'new'
          end
        end
      

      希望对你有帮助!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-03-13
        相关资源
        最近更新 更多