0

Ich benutze Büroklammer, um Bilder zu speichern. Alles funktioniert gut und ich kann mit @ item.image.url auf die URL des Artikels zugreifen.Paperclip image.url in Backbone.js Ansichten

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

Dies ist Konsole:

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

Das ist unkompliziert und einfach, wenn ich HAML oder ERB vom Server am Templating und die Seite an den Benutzer wie folgt serviert. Artikel/show.html.haml:

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

jedoch mit Backbone.js, ich bin nicht in der Lage, die URL zu konstruieren, weil ich nicht die Büroklammer Helfer im Kontext habe. Im Wesentlichen sende ich die folgenden Attribute des Bildes auf die Seite in JSON-Form.

#<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 
} 

Was ist ein Ninja Weg, um die image.url als ein Attribut auf dem Artikel enthalten. Wie kann ich die Style-URLs berücksichtigen? Es wäre schön, ein Attribut wie "image_small_url", "image_normal_url", usw. vorherbestimmt und zugänglich zu haben. Gedanken?

+0

Wie werden die Attribute des Bildes auf die Seite in JSON-Form gesendet? –

Antwort

9

ich Jbuilder bin mit der JSON Ansichten für ein Projekt zu bauen, ich arbeite, so dass meine index Ansicht, sieht zum Beispiel wie folgt aus:

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 

diese Weise in meinem Backbone-Vorlage, kann ich sag einfach thing.get('image_url') und thing.get('thumb_url').

Kurz gesagt, Sie möchten etwas wie Jbuilder verwenden oder as_json in Ihrem Modell manuell überschreiben. Persönlich kümmere ich mich gerne darum auf der Ansichtsebene, was Jbuilder Ihnen leicht macht.

+0

+1. Ein weiteres beliebtes Juwel ist [RABL] (https://github.com/nesquena/rabl). –

+0

Danke! extrem hilfreich. Model.to_json ist ein guter Ort, um auch sensible Attribute wie coded_password herauszufiltern. Brillant. –

+0

Beachten Sie auch, dass das Überschreiben von 'Model.as_json' generell gegenüber' Model.to_json' empfohlen wird, da '_json' von' to_json' verwendet wird, um die gewünschte Datenstruktur tatsächlich zu erstellen. – clem

1

Während JSON Erzeugung in Controllern ist machbar, ich stark bevorzugen Einwickeln diese Art von Funktionalität bis in entweder Dekorateure (z.B. Draper) oder in Rahmen für RESTful Ressourcen entwickelt (zum Beispiel Roar).

Dadurch wird die Zuordnung zwischen Modellen und ihren externen Darstellungen stark lokalisiert, das direkte Testen von Darstellungen außerhalb des Web-App-Frameworks usw. ermöglicht.

Zum Beispiel clem Antwort würde innerhalb einer einzigen Klasse isoliert werden, etwa:

class ThingDecorator < Draper::Decorator 
    delegate_all 

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

Dann in der Steuerung, zum Beispiel:

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

(oder was auch immer Sie brauchen, und was funktioniert Hängt von der Rails-Version ab (siehe Draper-Dokumentation).

Setzen Sie die Sammlung dann mit normalen Mitteln als JSON frei. IMO das ist fast immer sauberer.

0

Ein weiteres einfaches Beispiel mit jbuilder:

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

die hier :snap ist die Büroklammer Befestigung - der Ausgang aus diesem Beispiel ist:

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

hoffe, das hilft!

Verwandte Themen