我正在使用回形针来保存图像。一切正常,我可以使用@ 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”等属性预定和可访问的将是很好的。想法?
答案 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"}]
希望这有帮助!