質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Go

Go(golang)は、Googleで開発されたオープンソースのプログラミング言語です。

Q&A

1回答

962閲覧

gin mysql 特定のカラムの文字を一部置換してブラウザ表示させる方法

退会済みユーザー

退会済みユーザー

総合スコア0

Go

Go(golang)は、Googleで開発されたオープンソースのプログラミング言語です。

0グッド

0クリップ

投稿2020/03/07 08:45

type Profile struct { Name string Food string Comment string Create_time string } db := model.DBConnect() //modelフォルダ内のファイルのDBConnect()メソッドでdbに接続 var profile_all []Profile //mysqlのprofilesテーブル db.Limit(10).Order("create_time desc").Find(&profile_all)

取り出したprofile_allをこのままginでブラウザ表示させると以下のようになっています
mysqlに\nも保存しているので改行されています

[{tarou メロン こんにちは こんばんは}{jiro イチゴ 好きな 食べ物は イチゴです}{saburo 焼肉 昨日の ご飯は焼肉}]

ただginで{{.Comment}}と取り出した場合改行がされません
\nを<br>に置換したいのですがどのようにすれば良いのでしょうか?

<pre>で挟むのではなく置換したいと思っています https://stackoverflow.com/questions/38804290/how-to-print-new-lines-in-golang-template https://stackoverflow.com/questions/13779027/html-templates-replacing-newlines-with-br ら辺も試したのですがmysqlから取り出した構造体の要素の一部だけを変えるやり方がわかりませんでしたの教えていただきたいです よろしくお願いいたします go version go1.13.8 mysql –version // Ver 8.0.19 ブラウザ表示のフレームワーク gin

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

データ構造と表示にまつわる処理は分離することをお勧めします。
(データ構造の一部分を差し替えてデータ構造そのものを表示に使うのはお勧めしません)

例えば、[]Profileを受け取ってTemplateエンジンで展開する際に
希望の処理を入れ込むなどが考えられます。

例:
https://play.golang.org/p/r9ujR4wk9ER

go

1package main 2 3import ( 4 "html/template" 5 "os" 6 "strings" 7) 8 9type Profile struct { 10 Name string 11 Food string 12 Comment string 13 Create_time string 14} 15 16const templateSrc = ` 17{{- range .Profiles}} 18{{.Name}}/{{replace .Comment "\n" "<br/>"}} 19{{end -}} 20` 21 22var tmpl = template.Must(template.New("").Funcs(map[string]interface{}{ 23 "replace": func(s, old, new string) template.HTML { 24 return template.HTML(strings.Replace(s, old, new, -1)) 25 }, 26}).Parse(templateSrc)) 27 28func main() { 29 tmpl.Execute(os.Stdout, map[string]interface{}{ 30 "Profiles": []Profile{ 31 {Name: "Foo", Comment: "hello\nworld"}, 32 }, 33 }) 34}

投稿2020/03/09 02:57

nobonobo

総合スコア3367

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2020/03/12 09:44

ありがとうございます "html/template"の使用は初めてだったのですが調べて、それぞれの関数の意味はなんとなくなのですがわかりました ginのcontrollerファイルでDBから取り出した&profile_allをbrに変換した後それをviewに渡したいのですが、これはどうすれば良いのでしょうか? db.Limit(10).Order("create_time desc").Find(&profile_all) profile_allのcomment内の\nをbrに変換 ctx.HTML(200, "index.html", gin.H{"hensuu": profile_all}) としたいです
nobonobo

2020/03/16 22:38

ginにもSetFuncMapという機能があり、僕の回答通りにできると思います。 profile_allの中を書き換えるのはやっつけとしては別にやってもいいとは思いますが、複雑なものを書く様になったときに、処理前か処理後なのかを読みにくくなるのでお勧めしません。
nobonobo

2020/03/16 22:42

要するにcommentフィールドの型を固定した方がいいのです。そのフィールドがプレーンテキストなのか、HTMLなのかを決めてその構造体を参照する時に期待されている文字列がどの様な値なのかが一意になっていることが大切です。
nobonobo

2020/03/16 22:49

型をHTMLと決めたならDBインサート時点でHTMLバリデーションして書き込み、わざわざ変換が表示のたびに行わなくて済むというメリットが生まれたりします。とにかく、同じ構造体を使いつつここではプレーンテキスト、ここではHTMLというような書き方はお勧めしません。
退会済みユーザー

退会済みユーザー

2020/03/17 14:35

なるほど ありがとうございます! インサートの時点でHTMLで保存というやり方もあるのですね それで、いまいち理解が出来ていない所があるのですが、replaceは書き換えにはならないのでしょうか? 自分もdbから取り出し、取り出したものを書き換え(dbデータを上書き書き換え保存をするのではなく、取り出したものをreplaceのようなもので変更し変数に格納)、viewに渡す。というイメージだったので同じかなと思ったのですが? すいません
退会済みユーザー

退会済みユーザー

2020/03/17 16:17

それと{{ }}はcontrollerから渡された物をviewで取り出す際に使う物なのかなと思っていたのですが、controllerとviewファイルを分けている場合、 const templateSrc = ` {{- range .Profiles}} {{.Name}}/{{replace .Comment "\n" "<br/>"}} {{end -}} ` はviewの方に書くのでしょうか? ただそういたしますとcontrollerで変数が未定義になってしまいすしやはりcontrollerに書くという事でよいのでしょうか? あと、勘違いをしていたのかもしれないのですが、replaceで置き換えたものをviewに渡すのではなく置き換える関数?をviewに渡してviewで置き換えをしているのでしょうか?
nobonobo

2020/03/17 23:28 編集

表示のための構造体なりコントローラなりを用意してあらかじめHTML化しておいてビューに渡すのは良いと思います。DBのモデル定義のままテキストをHTMLに置き換えはお勧めしません。
nobonobo

2020/03/17 23:35

また、さらっとDBにHTML入れてしまう話を書いてしまいましたが、セキュアなHTMLを保つにはノウハウが必要なので気をつけてください。
退会済みユーザー

退会済みユーザー

2020/03/19 08:40 編集

最初に定義をした構造体の型は上書き編集をしない方がよく、取り出した物をリプレイスするのはよいという事でいいのですよね? viewに渡す変数をどうするかで悩んだのですが、コメント部分のみ教えて頂いたtemplate.htmlで置き換え、渡してみた所表示はなんとか改行はできていました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問