2012-03-31 13 views
7

ऐप के Example यहां है।गोलांग जीएई - मूंछ के लिए संरचना में intid

इम Golang गूगल AppEngine पर में एक छोटे से ब्लॉग प्रणाली का निर्माण और टेम्पलेट इंजन के रूप में मूंछें उपयोग करने की कोशिश golang-कोड/हैंडलर/handler.go (के बाद विषय एक आईडी दिखाई देनी चाहिए!): आवश्यक कोड में है।

type Blogposts struct { 
    PostTitle string 
    PostPreview string 
    Content  string 
    Creator  string 
    Date  time.Time 
} 

डेटा GAE में भेजा जाता है के माध्यम से

datastore.Put(c, datastore.NewIncompleteKey(c, "Blogposts", nil), &blogposts) 

तो, GAE स्वचालित रूप से प्रदान करती है एक intID (int64):

तो, मैं एक struct है। अब मैं नवीनतम ब्लॉगपोस्ट

// Get the latest blogposts 
c := appengine.NewContext(r) 
q := datastore.NewQuery("Blogposts").Order("-Date").Limit(10) 

var blogposts []Blogposts 
_, err := q.GetAll(c, &blogposts) 

तक वहाँ सब बातों ठीक काम करता है पाने की कोशिश की, लेकिन जब मैं intID तक पहुँचने का प्रयास (या stringID, जो कुछ भी) मैं न इस :-(

<h3><a href="/blog/read/{{{intID}}}">{{{PostTitle}}}</a></h3> 
की पहुंच है ?

(PostTitle काम करता है, intID नहीं, मैं चीजों की हजार की कोशिश की है, कुछ भी नहीं :-(काम किया)

किसी को भी एक विचार यह बहुत अच्छा होगा

संपादित करें: मैं मूंछ का उपयोग करता हूं।

http://mustache.github.com/

कोड में मैं का उपयोग करें:

x["Blogposts"] = blogposts 
data := mustache.RenderFile("templates/about.mustache", x) 
sendData(w, data) // Equivalent to fmt.Fprintf 

और फिर डेटा के साथ .mustache टेम्पलेट में पहुँचा जा सकता है {{{सामग्री}}} या {{{PostTitle}}} आदि

+0

'{{{}}} ': क्या आप एक HTML/टेम्पलेट का विस्तार कर रहे हैं? यदि ऐसा है, तो उस कोड के कम से कम एक स्निपेट को देखने के लिए जोड़ें। – zzzz

+0

हाय, नहीं, मैं मूंछ का उपयोग करता हूं। संपादन देखें :-) – Testuser

उत्तर

8

intID एक कुंजी की आंतरिक संपत्ति है जो संरचना नहीं है, और इसके माध्यम से सुलभ है एक गेटर:

id := key.IntID() 

GetAll रिटर्न []*Key, जो आप उपयोग नहीं कर रहे:

_, err := q.GetAll(c, &blogposts) 

एक तरीका यह चारों ओर पाने के लिए एक viewmodel struct दोनों अपनी पोस्ट और महत्वपूर्ण जानकारी है कि (अपरीक्षित बनाने के लिए है , लेकिन यह इसका सारांश है):

//... handler code ... 

    keys, err := q.GetAll(c, &blogposts) 
    if err != nil { 
    http.Error(w, "Problem fetching posts.", http.StatusInternalServerError) 
    return 
    } 

    models := make([]BlogPostVM, len(blogposts)) 
    for i := 0; i < len(blogposts); i++ { 
    models[i].Id = keys[i].IntID() 
    models[i].Title = blogposts[i].Title 
    models[i].Content = blogposts[i].Content 
    } 

    //... render with mustache ... 
} 

type BlogPostVM struct { 
    Id int 
    Title string 
    Content string 
} 
+0

बहुत बहुत धन्यवाद, इससे मुझे बहुत मदद मिली! :-) – Testuser

0

AFAICS, Blogposts संरचना में कोई क्षेत्र intID नहीं है, लेकिन इसमें एक क्षेत्र PostTitle है। मुझे लगता है कि पूर्व कारण नहीं है और बाद में इसे प्रस्तुत किया जाता है, हालांकि मैंने कभी भी मूशा का उपयोग नहीं किया है ...

+0

यह अप्रासंगिक है। डेटास्टोर "intid" और "stringID" को अनदेखा करता है :-((NewIncompleteKey के माध्यम से एक intID निर्दिष्ट करने का प्रयास करें, यह काम नहीं करेगा ;-)) – Testuser

+0

मैं लाइन 'डेटा के बारे में बात कर रहा हूं: = mustache.RenderFile ("टेम्पलेट्स/about.mustache ", एक्स)', डेटास्टोर के बारे में नहीं। 'रेंडरफाइल' फ़ंक्शन को 'intID' पता होना चाहिए? – zzzz

+0

आपके प्रतिनिधि के लिए धन्यवाद। और मेरी बुरी अंग्रेजी के लिए खेद है। (शायद मैं कठोर लग रहा हूं, लेकिन यह मेरा इरादा नहीं है!) X में ब्लॉगपोस्ट्स structs (और कुछ अन्य) शामिल हैं। अगर मैं, ब्लॉगपोस्ट structs को intID जोड़ने के लिए इस अभ्यस्त काम है क्योंकि यह IMHO – Testuser

15

रूप hyperslug ने कहा, एक इकाई की आईडी फ़ील्ड कुंजी, नहीं struct इसे में पढ़ा जाता है पर है।इसलिए

की तरह)

type Blogposts struct { 
    PostTitle string 
    PostPreview string 
    Content  string 
    Creator  string 
    Date  time.Time 
    Id   int64 `datastore:"-"` 
} 

फिर आप मैन्युअल GetAll के लिए एक कॉल (के बाद ईद क्षेत्र को पॉप्युलेट कर सकते हैं:

इस के चारों ओर एक और तरीका है अपने struct को एक आईडी क्षेत्र जोड़ सकते हैं और ignore it को डेटासंग्रह कहता हूं, जैसे करने के लिए है

keys, err := q.GetAll(c, &blogposts) 
if err != nil { 
    // handle the error 
    return 
} 
for i, key := range keys { 
    blogposts[i].Id = key.IntID() 
} 

इसका अतिरिक्त प्रकार शुरू करने का लाभ नहीं है।

2

मैं जानता हूँ कि इस सवाल का एक जोड़ी साल पुराना है, लेकिन निम्न लेख इस संबंध में मेरे लिए बहुत मददगार था: Golang basics with Google Datastore

लेख में, लेखक कैसे आप एक प्रश्न है कि इसके आईडी के आधार पर एक इकाई हो जाता है चला सकते हैं का एक अच्छा उदाहरण प्रदान करता है ...

func GetCategory(c appengine.Context, id int64) (*Category, error) { 
    var category Category 
    category.Id = id 

    k := category.key(c) 
    err := datastore.Get(c, k, &category) 
    if err != nil { 
    return nil, err 
    } 

    category.Id = k.IntID() 

    return &category, nil 
} 

... के साथ-साथ की एक सूची/संग्रह हो रही उनके संबद्ध आईडी के साथ संस्थाओं:

func GetCategories(c appengine.Context) ([]Category, error) { 
    q := datastore.NewQuery("Category").Order("Name") 

    var categories []Category 
    keys, err := q.GetAll(c, &categories) 
    if err != nil { 
    return nil, err 
    } 

    // you'll see this a lot because instances 
    // do not have this by default 
    for i := 0; i < len(categories); i++ { 
    categories[i].Id = keys[i].IntID() 
    } 

    return categories, nil 
} 

स्निपेट के ऊपर @koz द्वारा उपयोगी जवाब देने के लिए बहुत करीब है।

संबंधित मुद्दे