【问题标题】:Why is attachment_fu updating every attachment instead of just the changed ones? [duplicate]为什么 attachment_fu 更新每个附件而不仅仅是更改的附件? [复制]
【发布时间】:2009-09-01 15:37:35
【问题描述】:

我在使用attachment_fu 的图像模型上有一个带有has_manyaccepts_nested_attributes_for 的属性模型。使用以下代码更新属性会导致每个图像(以及每个图像缩略图)的数据库更新,无论是否对其进行了更改。

properties_controller.rb

  def update
    @property.update_attributes params[:property]
    redirect_to edit_property_path(@property)
  end

_form.html.erb

<% form_for @property do |property| %>  
  ...
  <ul id='image-admin'>
    <% @property.images.each do |image| %>
      <li>
      <%= image_tag image.public_filename(:front), :alt=> h(image.caption), :size => "218x160" %>
      <% property.fields_for :images, image do |img| %>
        <%= img.hidden_field :ordering, :class => 'order' %>
        <%= img.text_field :caption %>
        <span class='img_remove'>
          Remove ? <%= img.check_box '_delete' %>
        </span>
      <% end %>
      </li>
    <% end %>
  </ul>
  ...
<% end %>

脚本/服务器输出

  SQL (8.7ms)   COMMIT
  SQL (0.1ms)   BEGIN
  Image Update (0.3ms)   UPDATE `images` SET `updated_at` = '2009-09-01 15:17:19', `size` = 103402 WHERE `id` = 350
  Image Load (0.5ms)   SELECT * FROM `images` WHERE (`images`.`thumbnail` = 'small' AND `images`.`parent_id` = 350) ORDER BY ordering ASC LIMIT 1
  Image Update (0.3ms)   UPDATE `images` SET `updated_at` = '2009-09-01 15:17:19', `size` = 60535 WHERE `id` = 352
  Image Load (0.5ms)   SELECT * FROM `images` WHERE (`images`.`thumbnail` = 'front' AND `images`.`parent_id` = 350) ORDER BY ordering ASC LIMIT 1
  Image Update (0.3ms)   UPDATE `images` SET `updated_at` = '2009-09-01 15:17:19', `size` = 39888 WHERE `id` = 353
  Image Load (0.4ms)   SELECT * FROM `images` WHERE (`images`.`thumbnail` = 'thumb' AND `images`.`parent_id` = 350) ORDER BY ordering ASC LIMIT 1
  Image Update (0.3ms)   UPDATE `images` SET `updated_at` = '2009-09-01 15:17:19', `size` = 3510 WHERE `id` = 351
  SQL (0.9ms)   COMMIT
  SQL (0.1ms)   BEGIN
  Image Update (0.3ms)   UPDATE `images` SET `updated_at` = '2009-09-01 15:17:19', `size` = 100387 WHERE `id` = 338
  Image Load (0.4ms)   SELECT * FROM `images` WHERE (`images`.`thumbnail` = 'small' AND `images`.`parent_id` = 338) ORDER BY ordering ASC LIMIT 1
  Image Update (0.3ms)   UPDATE `images` SET `updated_at` = '2009-09-01 15:17:19', `size` = 58212 WHERE `id` = 340
  Image Load (0.4ms)   SELECT * FROM `images` WHERE (`images`.`thumbnail` = 'front' AND `images`.`parent_id` = 338) ORDER BY ordering ASC LIMIT 1
  Image Update (0.8ms)   UPDATE `images` SET `updated_at` = '2009-09-01 15:17:20', `size` = 38101 WHERE `id` = 341
  Image Load (0.4ms)   SELECT * FROM `images` WHERE (`images`.`thumbnail` = 'thumb' AND `images`.`parent_id` = 338) ORDER BY ordering ASC LIMIT 1
  Image Update (0.3ms)   UPDATE `images` SET `updated_at` = '2009-09-01 15:17:20', `size` = 3241 WHERE `id` = 339
  SQL (0.8ms)   COMMIT

任何想法为什么(以及我如何阻止)attachment_fu 这样做?看起来它认为 size 属性发生了变化,但我看不出有任何理由(在我的代码或 attachment_fu 中)为什么它应该这样认为。

【问题讨论】:

  • 从 Rails 控制台运行以下命令会产生相同的结果,图像及其缩略图被更新,但只设置了 size 和 updated_at 字段: i=Image.last; i.caption=i.caption; i.save;

标签: ruby-on-rails ruby attachment-fu


【解决方案1】:

fields_for 为关联中的每个图像重复包含的字段。但是你有一个外部循环,为关联中的每个图像重复fields_for。因此,当您提交时,您发送的更新比您想要发送的要多得多。

试试这个:

<% form_for @property do |property| %>  
  ...
  <ul id='image-admin'>
    <% property.fields_for :images, image do |img| %>
      <li>
      <%= image_tag img.object.public_filename(:front), :alt=> h(img.object.caption), :size => "218x160" %>
        <%= img.hidden_field :ordering, :class => 'order' %>
        <%= img.text_field :caption %>
        <span class='img_remove'>
          Remove ? <%= img.check_box '_delete' %>
        </span>
      </li>
    <% end %>
  </ul>
  ...
<% end %>

【讨论】:

  • fields_for 的第二个参数采用实例来创建字段,该实例由 'image' 变量中的 .each 循环提供。它正在创建正确的标记,但如果我在表单中没有输入任何更改(仅用于更改标题和删除)并提交它,它会更新每个图像设置 updated_at 和 size 列。
猜你喜欢
  • 2023-04-02
  • 2014-05-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-15
  • 1970-01-01
相关资源
最近更新 更多