Paperclip将删除当前图像,即使它在更新时没有更改

时间:2013-10-27 13:53:50

标签: ruby-on-rails ruby-on-rails-4 paperclip

我正在使用Paperclip让我的用户上传图片。

分离的单一资源非常适用。我可以使用RESTFUL结构添加,编辑和删除所有图像而无需任何额外的工作。

但是在使用嵌套属性时我遇到了一些困难。

我有两个名为ArticleHeadline的模型。

我在视图中使用Article表单来创建Headline的关联实例。所以我在ActiveRecord中使用accepts_nested_attributes_for。我已经设置了与此相关的所有内容。我在表单视图中使用fields_for。强参数设置全部完成。通过添加标题新文章,一切都很有效。我还有一个title字段可以适当更新。

<%= f.fields_for :headline do |r| %>
  <%= r.label :title  %>
  <%= r.text_field :title %>
  <%= r.label :image, "Headline image" %>
  <%= r.file_field :image %>
<% end %>

当我在没有更改Headline图像的情况下更新文章时,Headline的图像会消失。

据我所知和经验,Paperclip不会更新图像文件,除非它们被更改。这是预期的行为。但在这种情况下,它会覆盖嵌套模型的属性,即使它不应该。

我认为必须有解决方法吗?

Article.rb

class Article < ActiveRecord::Base

  after_commit :expire_caches

  scope :desc, ->{ order(created_at: :desc)}

  scope :with_images, -> {where.not(image_file_name: nil)}

  before_validation :set_default_category

  acts_as_taggable

  attr_accessor :is_headline

  has_attached_file :image, default_url: "default_:style.png",
    :styles => { :large=>"700", :medium => "296", :thumb => "150", mini_thumb: "50x50>", :absolute_thumb=>"150x150#" },
    :s3_host_name => 's3-eu-west-1.amazonaws.com',
    :path => "articles_images/:id/:style/:basename.:extension"
  #validates :title, presence: true
  belongs_to :category
  belongs_to :user
  validates :title, :content, presence: true
  validates :content, length: {minimum: 10}
  validates :category_id, presence: true
  validates :cihan_url, uniqueness: true, allow_nil: true
  has_many :galleries, dependent: :destroy
  has_one :headline, dependent: :destroy
  has_one :ad, dependent: :destroy

  has_many :videos

  accepts_nested_attributes_for :headline


  def self.main_page
    where(main_page: true).with_images.desc
  end

  def to_param
    "#{self.id}-#{self.title.parameterize}"
  end

  private

  def set_default_category
    self.category = Category.uncategorized if self.category.blank?
  end

  def expire_caches
    Rails.cache.clear
  end


end

Headline.rb

class Headline < ActiveRecord::Base
  after_commit :expire_caches
  has_attached_file :image, default_url: "default_:style.png",
    :styles => {  :large=>"600", :medium => "300x300>", :thumb => "150x150>", :absolute_thumb=>"150x150#" },
    :s3_host_name => 's3-eu-west-1.amazonaws.com',
    :path => "headline_images/:id/:style/:basename.:extension"
  belongs_to :article

  private

  def expire_caches
    Rails.cache.clear
  end
end

来自articles_controller

def set_article
  @article = Article.find(params[:id])
end


def update
  if @article.update(article_params)
    redirect_to [:admin, @article], flash: {success: "<i class=\"icon-ok\"></i> Haber başarıyla düzenlendi.".html_safe}
  else
    render action: 'edit'
  end
end


def article_params
  params.require(:article).permit(:title, :content, :publish_date, :category_id, :active, :tag_list, :main_page, :extra_title, :image, :is_headline, headline_attributes: [:title, :counter, :order, :image])
end

0 个答案:

没有答案