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 栏中输入的内容)。

如果您/places/21.json在浏览器中输入 URL 栏,它会调用带有 id = 21 和 format = json 参数的位置控制器。然后它将在控制器中定义的函数的末尾呈现适当命名的视图(在这种情况下将是您的 RABL 模板)。@place然后,该模板根据第一行定义的变量的值呈现它的数据。

我假设您的控制器将@place变量设置为params[:id]或类似的东西。

当您调用时,render您实际上是在手动执行控制器功能自动为您执行的最后一部分:显示模板。然后,您应该指定渲染的模板,确保事先设置任何变量。

所以places/show.json.rabl工作的原因仅仅是因为你正在渲染适当命名的模板。这将在您的文件夹内呈现show模板。然后它将使用我假设您之前在控制器或视图中定义的变量。placesviews@place

TL;DR
你最后通过渲染模板做了正确的事情。您可以通过更改模板在第一行使用的变量来呈现不同的对象。

于 2013-05-19T23:26:47.950 回答