Backbone.js视图中的Paperclip image.url

时间:2012-04-09 23:32:55

标签: ruby-on-rails ruby-on-rails-3 ruby-on-rails-3.1 backbone.js paperclip

我正在使用回形针来保存图像。一切正常,我可以使用@ item.image.url访问该项目的网址。

class Item
 has_attached_file :image, :styles => {
      :original => ['1920x1680>', :jpg],
      :small => ['100x100>', :jpg],
      :medium => ['250x250>', :jpg],
      :large => ['500x500>', :jpg]
    }
end

这是控制台:

> Item.last.image.url(:small)
=> "/system/images/items/1/small/chanel.jpg?1334005208" 

如果我从服务器模板化HAML或ERB并像这样向用户提供页面,这是简单易行的。项目/ show.html.haml:

.item
  .item-image
    = image_tag @item.image.url(:small)

但是,对于backbone.js,我无法构造URL,因为我在上下文中没有回形针助手。基本上,我将图像的以下属性以json格式发送到页面。

#<Item:0x007fc97559b960> {
                    :id => 1,
    :image_content_type => "image/jpeg",
       :image_file_name => "chanel.jpg",
       :image_file_size => 28880,
      :image_updated_at => 2012-04-09 21:00:08 UTC
}

将image.url作为项目的属性包含在内的忍者方法是什么?我如何考虑样式URLS?有一个像“image_small_url”,“image_normal_url”等属性预定和可访问的将是很好的。想法?

3 个答案:

答案 0 :(得分:9)

我正在使用Jbuilder为我正在处理的项目构建JSON视图,因此我的index视图就像这样:

json.array!(@things) do |json, thing|
  json.id thing.id
  json.name thing.name
  json.description thing.description
  json.image_url thing.image.url
  json.thumb_url thing.image.url(:thumb)
end

在我的Backbone模板中,我可以说thing.get('image_url')thing.get('thumb_url')

简而言之,您需要使用类似Jbuilder的内容,或在模型中手动覆盖as_json。就个人而言,我喜欢在视图级别处理这个问题,这是Jbuilder允许您轻松完成的任务。

答案 1 :(得分:1)

虽然在控制器中生成JSON是可行的,但我非常更喜欢在装饰器(例如,Draper)或者为RESTful资源设计的框架中包含这种功能(例如, Roar)。

这使得模型及其外部表示之间的映射保持高度本地化,允许直接测试Web应用程序框架之外的表示,等等。

例如,clem的答案将在一个类中被隔离,大致如下:

class ThingDecorator < Draper::Decorator
  delegate_all

  def image_url; object.image.url;         end
  def thumb_url; object.image.url(:thumb); end
end

然后在控制器中,例如:

@things = Thing.some_scope.decorate # Or
@things = ThingDecorator.decorate_collection(Thing.all)

(或者无论你需要什么,哪些有效取决于Rails版本,请参阅Draper文档。)

然后使用常规方法将集合公开为JSON。 IMO几乎总是更清洁。

答案 2 :(得分:0)

使用jbuilder的另一个简单示例:

# index.json.jbuilder
json.array!(@shared_snap_casts) do |shared_snap_cast|
  json.extract! shared_snap_cast, :id, :snap
end

此处:snap是回形针附件 - 此示例的输出为:

[{"id":1,"snap":"/system/shared_snap_casts/snaps/000/000/001/original/some_icon.png?1388093936"}]

希望这有帮助!