我正在使用 Paperclip 让我的用户上传图片。
它适用于分离的单一资源。使用 RESTFUL 结构,我可以毫不费力地添加、编辑和删除所有图像。
但是在使用嵌套属性时我遇到了一些困难。
我有 2 个模型称为Article
和Headline
。
我Article
在视图中使用表单来创建Headline
. 所以我正在使用accepts_nested_attributes_for
ActiveRecord。我已经设置了与此相关的所有内容。我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