0

私は#322 RailsCastsをフォローしていますが、最後の部分で彼はjsonをhtmlに埋め込む方法についてコメントしています。

<div id="articles" data-articles="<%= render(template: "articles/index.json.rabl") %>" >

私のプロジェクトには、rablテンプレートがあります:app / views / Places / show.json.rabl

object  @place
attributes :id, :name, :desc, :address
node(:type) { |place| place.type_place.name }
child :photos do 
  attributes :id, :desc
  node(:url) { |photo| photo.image.url(:square) }
end

/places/21.jsonをレンダリングすると、次のように表示されます。

{"id":21,"name":"foo","desc":"bar","address":"some address","type":"baz",
 "photos":[{"id":26,"desc":"foofoo","url":"/uploads/photo/image/26/square_conmemorativo-1920x1080.jpg"}]}

うまく機能していますが、jsonデータをhtmlに埋め込もうとすると、次のようになります。

<article id="show_place" data-place="<%= render(template: "places/#{@place.id}.json.rabl") %>" >

エラーログ

{:locale => [:en]、:formats => [:html]、:handlers => [:erb、:builder、:coffee、:rabl]}のテンプレートplaces/21.jsonがありません。検索対象:* "/ home / ed / projects / rails_projects / final_u / app / views"

私は何を間違っていますか?

アップデート

私はちょうど解決策を見つけました

<article id="show_place" data-place="<%= render(template: "places/show.json.rabl") %>" >

そしてそれは動作しますが、理由はわかりません..そしてここに別の質問があります

単一のオブジェクトをrender(template: "")に渡す方法がありますか?

よろしくお願いします....そして私の英語をごめんなさい

4

1 に答える 1

0

この背後にある理由は、render. この関数は、ルート (URL バーに入力しているもの) ではなく、テンプレート自体がレンダリングされることを想定しています。

ブラウザーの URL バーに入力/places/21.jsonすると、id = 21 および format = json のパラメーターを使用して Places コントローラーが呼び出されます。次に、コントローラーで定義された関数の最後に、適切な名前のビュー (この場合は RABL テンプレート) をレンダリングします。@placeそのテンプレートは、最初の行で定義された変数の値からデータをレンダリングします。

私はあなたのコントローラーが@place変数をparams[:id]何かで設定すると仮定しています。

呼び出すrenderときは、コントローラー関数が自動的に行う最後の部分であるテンプレートの表示を基本的に手動で行っています。次に、レンダリングするテンプレートを指定し、事前に変数が設定されていることを確認する必要があります。

したがって、適切な名前のテンプレートをレンダリングしているため、機能する理由places/show.json.rablは単純です。これにより、 内のフォルダーのshow下にテンプレートがレンダリングされます。次に、コントローラーまたはビューで以前に定義したと思われる変数を使用します。placesviews@place

TL;DR
テンプレートをレンダリングすることで、最後に正しいことを行いました。テンプレートが最初の行で使用する変数を変更することで、別のオブジェクトをレンダリングできます。

于 2013-05-19T23:26:47.950 に答える