2017-07-19 15 views
0

私は構造体の内部に2つの構造体からなる構造体のリストを範囲指定しようとしています。構造体でデータを正しく埋めても問題はありません。問題はHTMLにレンダリングしようとするときです。私は何も表示することはできません。構造体の構造体のオーバーレンジに行く

これは私の最初のgo webプロジェクトで、私は中小企業向けの車を販売するウェブサイトに取り組んでいます。私のデータベースは1.写真のCarsの1.Mとして設計されています。だからメインの車のページに。私はちょうど車の詳細と1つの写真をロードしたいです。私は地図を使ってこれを試してみましたが、普通のIDの正しい車の詳細と一緒に1枚の写真を印刷したいときに問題に遭遇しました。だから私は各IDのために1つの写真を引き出す3番目の構造体を使用していると考えました。

type Car struct { 
    Id int 
    Year, Make, Model, Price string 
} 

type Pics struct { 
    Id int 
    Path string 
} 


type CarDetail struct { 
    Cars Car 
    Pic Pics 
} 

func cars(w http.ResponseWriter, r *http.Request){ 
    //loads all the cars in the database 
    cars := loadCars() 
    carDetails := make([]CarDetail,0) 
    carIds := make([]int,len(cars)) 
    for i := 0; i < len(cars); i++{ 
    //gets all the car IDs in the db 
    carIds[i] = getCarID(cars[i]) 
    photoPath := loadSinglePhoto(carIds[i]) //now have the single photo 
    n := CarDetail{Cars:cars[i],Pic:photoPath} 
    carDetails = append(carDetails, n) 
} 

fmt.Println(carDetails) //getting car details the way I want 
tpl.ExecuteTemplate(w, "cars", &carDetails) 
} 

私が構造体を渡す直前のprint文は、意図したとおりの情報を私に与えます。

[{{20 2009年ホンダアコード5000} {20公式/写真/ questionMark.jpg} {{21 2009年アキュラTLX 14000} {21公式/写真/ kia.png}} {{22 2015 Kia Sportage 34000 } {22パブリック/写真/ kia.png}}]

今、私はそれをレンダリングしようとすると、HTMLで

{{range .}} 
    <h3>{{.Cars.Make}} - {{.Cars.Model}} - {{.Cars.Year}}</h3> 
    <img src="{{.Pic.Path}}" id="{{.Pic.Id}}"> 
{{end}} 

私のコードの重要で気軽に、または別の方法を提案します。前もって感謝します!

+2

*常に 'ExecuteTemplate'によって返された' error'をチェックしてください。 '' cars ''は変数名ではなくテンプレート名であると考えられます。 'ExecuteTemplate'の代わりに' tpl.Execute(w、&carsDetail) 'を使うことができます。 – putu

答えて

1

一般的なレベルでいくつかの発言:

  • あなたの命名は少し誤解を招くようです。Picsのは、単一の画像を保持し、多くはない(いない配列またはマップ);同じことは、あなたが、私はすべての単一車で写真を検索することも
  • を実行しないであろうと、私は、車や(プライマリー)画像の両方を返すクエリを構築することをお勧めします使用しているデータベースを知らないCarDetail.Cars
  • に適用されます、特定の拡張子(例:「cars.gohtml」)とサブフォルダ内のファイルとしてテンプレートを保存をお勧めしますし、それが動作する必要があることから、別にtemplate.ParseGlob(「テンプレート/ *。gohtml」)

を使用ここで少しリファクタリングした実例をご覧ください: https://play.golang.org/p/CPnad9FxaB

あなた自身のコードで間違っていますか?

+0

備考ありがとうございます。基本的には、ページを読み込むと、cars.htmlページにデータが表示されません。私はすでにテンプレート用のフォルダを持っています。単一のクエリは大きなポイントです。その1枚だけをプルするために、「プライマリ」のフィールドを追加することをお勧めしますか? 問題は、ページに何も表示されないことです。私は1つ1つを試しても動作しますが、CarDetailsのリストには、htmlページに何もレンダリングされていません – Ben

+0

「CarDetail」のリストを渡すとうまく動作しますが、データベース、それは動作しません。テンプレートを実行する前に情報が正しく出力されるため、情報がそこにあることがわかります。すなわち、提供された例がうまく動作します。しかし、私の例では、トップは何もレンダリングしません。エラーは返されず、ページがロードされ、サーバー側からのデータはまったくロードされません。 – Ben

+0

おそらくテンプレート化するとHTMLコメントが見られないので、あなたの "コメントアウトされたHTML"があなたのデータを受け取った可能性があります:)あなたのコメントをもう一度試して、ブラウザでレンダリングしたページのソースコードを調べてください。 – mhcbinder

0

だから私は原因を見つけました。不思議にも、以前のHTMLコードでは、テンプレートがレンダリングされないとコメントしていました。なぜ私は分からない。

<!-- 

<h1>Your Pictures:</h1> 
{{range .Pics}} 
<img class="insertedPics" src="{{.Path}}" alt="pic" id="{{.Id}}" 
height="500px" width="500px"> 
{{end}} 

{{range .Cars}} 
<h3>{{.Make}} - {{.Model}} - {{.Year}} </h3> 
{{end}} 

<img src="{{.Pic.Path}}" alt="car pic" id="{{.Car.Id}}" height="600px" width="600px"> 

-->  <-- Once I removed this, everything worked fine. 

{{range .}} 
<h3>{{.C.Make}} - {{.C.Model}}</h3> 
<img src="{{.P.Path}}" alt="some pic" height="500px" width="500px" 
style=""> 
{{end}} 

ありがとうございました!