【问题标题】:Where to define liquid method for :url from attached file在哪里为附件中的 :url 定义液体方法
【发布时间】:2015-08-16 10:48:52
【问题描述】:

我博客上的帖子有几张图片

class Post < ActiveRecord::Base
     has_many :pictures, dependent: :destroy
end

图片有一个附加的图像文件,我使用gem回形针来管理这个。

class Picture < ActiveRecord::Base
    belongs_to :post

    has_attached_file :image,
        :path => ":rails_root/public/images/:id/:filename",
        :url  => "/images/:id/:filename",
        styles: { medium: "300x300>", thumb: "100x100>"  } 

    do_not_validate_attachment_file_type :image
end

我可以使用&lt;%= image_tag picture.image.url %&gt; 轻松创建图像标签 所以picture.image.url 返回存储图像的url。我正在尝试使用液体模板宝石来获取此网址。 我想做类似的事情

{% for picture in pictures %} 
<li style="background-image:'{{picture.image.url(:medium)}}';"></li>  
{% endfor %} 

我猜我需要一个液体方法:url,但我没有模型来编写它(因为image 是附件,而不是模型)。有人知道我如何通过液体获取图片网址吗?

【问题讨论】:

  • 液体序列化使用什么 gem,如何运行序列化?
  • 在我的 gemfile 中我只有 gem "liquid" 我会使用类似 markdown = Liquid::Template.parse(text).render("pictures" =&gt; @post.pictures) 的东西运行序列化

标签: ruby-on-rails ruby liquid


【解决方案1】:

似乎最简单的方法是手动序列化您的图片:

# ruby code
Liquid::Template.parse(text).render("pictures" => @post.pictures.map{|p| {'id' => p.id, 'medium_image_url' => p.image.url(:medium)})

# liquid code
{% for picture in pictures %} 
  <li style="background-image:'{{picture.medium_image_url}}';"></li>  
{% endfor %}

如果要将序列化分离到单独的模块中,可以将其移至ActiveModel::SerializerLiquid::Drop。如果您还使用 JSON(或 XML)序列化,ActiveModel::Serializer 是一个不错的决定,否则Liquid::Drop 是更好的选择(它专门用于序列化为液体)。这是来自Liquid::Drop docs 的修改示例:

# Ruby code

class PictureDrop < Liquid::Drop
  def initialize(picture)
    @picture = picture
  end

  def id
    @picture["id"]
  end

  def image_urls
    {
      'medium' => @picture.image.url(:medium),
      'thumb' => @picture.image.url(:thumb)
    }
  end
end

markdown = Liquid::Template.parse(text).render("pictures" => @post.pictures.map{|p| PictureDrop.new(p)})

# liquid code

{% for picture in pictures %} 
    <li style="background-image:'{{picture.image_urls['medium']}}';"></li>  
{% endfor %} 

【讨论】:

  • 非常感谢您花时间给我写这个解决方案 EugZol,它正是我想要的!
  • 不客气!如果您喜欢我的回答,也请考虑投票 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-02
相关资源
最近更新 更多