如何在rails Activestorage

时间:2018-06-12 07:40:21

标签: ruby ruby-on-rails-5 rails-activestorage

我有一个模型Post

has_one_attached :cover

没有必要附件。 那么,即使用户没有提供默认附件,我是否可以添加默认附件。

因此,当显示帖子时,我会显示一个封面图片。

<% if @post.cover.attached? %>
    <%= image_tag(@post.cover, class: 'card-img-top img-fluid') %>
<% else %>
    <div class="text-align-center img-place-holder">
          No Image Added Please add One
   </div>
<% end %>

除了检查某些内容是否已附加并尝试解决此问题之外,还有其他方法。

所以,我可以用,

<%= image_tag(@post.cover, class: 'card-img-top img-fluid') %>

直接没有任何if条件

谢谢

1 个答案:

答案 0 :(得分:6)

如果您想要附加默认图片(如果不存在),那么您可以在回调中执行此操作

# 1. Save a default image in Rails.root.join("app", "assets", "images", "default.jpeg")

# 2. In post.rb

after_commit :add_default_cover, on: [:create, :update]


private def add_default_cover
  unless cover.attached?
    self.cover.attach(io: File.open(Rails.root.join("app", "assets", "images", "default.jpeg")), filename: 'default.jpg' , content_type: "image/jpg")
  end
end

# 3. And in your view 
<%= image_tag(@post.cover, class: 'card-img-top img-fluid') %>

或者,如果您不想将默认封面附加到帖子但仍希望在帖子的展示页面上显示图片

# 1. Save a default image in Rails.root.join("app", "assets", "images", "default.jpeg")

# 2. In post.rb

def cover_attachment_path
  cover.attached? ? cover : 'default.jpeg'
end

# 3. And in your view
<%= image_tag(@post.cover_attachment_path, class: 'card-img-top img-fluid') %>