我正在使用Paperclip让我的用户上传图片。
分离的单一资源非常适用。我可以使用RESTFUL结构添加,编辑和删除所有图像而无需任何额外的工作。
但是在使用嵌套属性时我遇到了一些困难。
我有两个名为Article
和Headline
的模型。
我在视图中使用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