RailsでモデルのデータとしてURL表現も含むようなJSONを返すときにはJbuilderを使ってみるのがいいかも

3
OHWADA Jun🚿 @june29

active_decoratorでモデルに生やした便利メソッドをビュー以外(つまりモデルやコントローラ)の場所でも活用したい、という状況なんだけれど、そもそもなにか間違っているのだろうか…?

2013-01-31 18:44:52
Takuto Wada @t_wada

@june29 それはモデルにあるべきメソッドなのでは (内容によりますが)

2013-01-31 18:46:57
OHWADA Jun🚿 @june29

@t_wada 反応ありがとうございます!モデルの内容をJSONに展開してJavaScript側に渡したいときがあって、その中でURLを生成したい場合があります。たとえば、そのモデルをshowするURLですね。モデルのmethod内でURLを扱うにはどうしたらよいのでしょうか。

2013-01-31 18:52:34
OHWADA Jun🚿 @june29

@t_wada コントローラだとrender_to_stringやview_contextが使えたり、デコレータだとlink_toといったhelperが使えますよね。こういう処理をモデル側に寄せたいときは、どうすればいいのかなぁ… というのが悩みでした!

2013-01-31 18:55:03
Takuto Wada @t_wada

@june29 なるほど理解しました。私は URL の知識をモデルに持たせることを好まないので、モデルには寄せない、という判断をすると思います。decorator や presenter をコントローラは知っていて良いでしょう。モデルはそうはしないと思います。

2013-01-31 18:58:16
Takuto Wada @t_wada

@june29 ビュー知識だけでなくリソース知識も含めて、 decorator/presenter に置いて良いんじゃないですかね。モデルの表現 (representation) を他のモデルが必要にする局面とは、たとえばどんなものでしょうか?

2013-01-31 19:01:37
Kunio Okita @okitan

@june29 そもそも model をそのまま as_json してしまうのがよくないと思っていて、モデルを API のレスポンスにマッピングする層をもつべきだと思ってます。これとか使ったことないけどよさげ https://t.co/fR0iwsk3

2013-01-31 19:03:54
joker1007 (アルフォートおじさん) @joker1007

june29さんとt_wadaさんのやり取りを見て、詳細表示のためのURLをJSONで渡す時は、presenterクラスに処理済みモデルとコントローラーを渡して、そこでURLとJSON生成をしていたやり方は、そんなに悪くなかったのかな、と思った。

2013-01-31 19:07:57
OHWADA Jun🚿 @june29

@t_wada 「モデルの表現を他のモデルが必要にする」という状況、ちょっと考えてみたのですが、わかりませんでした!最初のツイートに書いた問題設定がよくない気がしています。少し整理します。モデルにURLの知識を持たせないというのは、ぼくもそう考えます。

2013-01-31 19:09:10
OHWADA Jun🚿 @june29

@t_wada ぼくの目の前にあったのは次のようなものです。たとえばEntryというモデルがあって、createが成功したときに「そのレコードの内容をJSONで返したい。内容として、リソースのURL表現も含めたい」といった状況でした。

2013-01-31 19:12:05
joker1007 (アルフォートおじさん) @joker1007

jsonバリバリ使う時は、AR単体だと全然足りない事が多いので、presenterクラス作って、再利用可能な形でハッシュに加工してる。コンストラクタでcontrollerを渡せるようにしていて、そこでURL系のヘルパーを使う。で、それをrespond_withとかに渡す。

2013-01-31 19:13:48
OHWADA Jun🚿 @june29

ROARのウェッッブサイトが有益すぎた http://t.co/cUMyZ64X

2013-01-31 19:14:53
Takuto Wada @t_wada

@june29 良くある状況ですね。モデルの表現にURLを含めたいけど、モデルにリソースの知識を持たせたくない。その状況をオブジェクト指向的に解決するために、decorator等が生まれたのではと思います。HTMLもJSONもリソースの表現で、それを描画するのがViewです。

2013-01-31 19:15:56
Akira Matsuda @a_matsuda

@june29 @t_wada モデルのJSON表現はviewなんですよ。entries/1(.html) でユーザーが見るものがviewでrenderされた文字列であるのと同様に、entries/1.json の文字列を組み立てるのはviewの仕事です。とDHHが言ってました。

2013-01-31 19:17:26
Akira Matsuda @a_matsuda

@june29 @t_wada なので、そのなんちゃらデコレーターとやらがイケてないだけなんじゃないっすかね?とか言ってみたりして。

2013-01-31 19:18:03
naoty @naoty_k

複雑なjsonはrabl使ってます

2013-01-31 19:19:18
Akira Matsuda @a_matsuda

@june29 @t_wada で、デコレーターうんぬんはとりあえず置いといて、そういうケースだとこいつを使ってみるといいと思うよ!って、某誌の某特集記事に書いてありました予定です(謎)。 https://t.co/aSVp5BeX

2013-01-31 19:20:22
joker1007 (アルフォートおじさん) @joker1007

rabl, jbuilder辺りでもっとビュー側に寄せるって書き方の方がいいのかもしれないなあ。

2013-01-31 19:22:01
kei-s @kei_s

"某誌の某特集記事に書いてありました予定です(謎)"

2013-01-31 19:22:06
Takuto Wada @t_wada

"某誌の某特集記事に書いてありました予定です" とは……

2013-01-31 19:25:17
Akira Matsuda @a_matsuda

@june29 何故Jbuilderを薦めたというと、scaffoldしたらデフォルトでこれが出てくるんですね。なので、今回のユースケースにはツールの思想的に一番しっくり来てそうな予感がします。 https://t.co/sCBDlxJA

2013-01-31 19:29:09
Takuto Wada @t_wada

jbuilder, オッサンには懐かしい名前である

2013-01-31 19:35:13
kei-s @kei_s

jBuilder, Java じゃなかった

2013-01-31 19:36:39
えむ。 @takkanm

jbuilder と spring ネタ、今年だけで 10 回ぐらいやってる

2013-01-31 19:40:40