Встраивание JSON в HTML с помощью Rails3 и Rabl

Я слежу за #322 RailsCasts, и в последней части он комментирует способ внедрения json в HTML

<div id="articles" data-articles="<%= render(template: "articles/index.json.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") %>" >

журнал ошибок

Отсутствует шаблон place/21.json с {:locale=>[:en], :formats=>[:html], :handlers=>[:erb, :builder, :coffee, :rabl]}. Искал в: * "/home/ed/projects/rails_projects/final_u/app/views"

Что я делаю неправильно?

ОБНОВЛЕНИЕ

Я только что нашел решение

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

И это работает, но я не знаю, почему.. и здесь у меня есть еще один вопрос

Есть способ передать один объект в рендер (шаблон: "") ??

Заранее спасибо.... и извините за мой английский


person figuedmundo    schedule 19.09.2012    source источник


Ответы (1)


Причиной этого является соглашение для render. Функция ожидает, что отобразится сам шаблон, а не маршрут (это то, что вы вводите в адресную строку).

Если вы введете /places/21.json в адресную строку браузера, он вызовет контроллер мест с параметрами id = 21 и format = json. Затем он отобразит представление с соответствующим именем (которое в данном случае будет вашим шаблоном RABL) в конце функции, определенной в вашем контроллере. Затем этот шаблон отображает данные из значения переменной @place, определенной в первой строке.

Я предполагаю, что ваш контроллер устанавливает переменную @place с params[:id] или чем-то подобным.

Когда вы вызываете render, вы, по сути, вручную делаете последнюю часть, которую функция контроллера автоматически делает за вас: отображение шаблона. Затем вы должны указать, какой шаблон вы хотите отобразить, предварительно убедившись, что все переменные заданы.

Итак, причина, по которой places/show.json.rabl работает, заключается просто в том, что вы визуализируете шаблон с соответствующим именем. Это отобразит шаблон show в вашей папке places внутри views. Затем он будет использовать переменную @place, которую вы, как я полагаю, определили ранее в своем контроллере или представлении.

TL;DR
В конце вы поступили правильно, отобразив шаблон. Вы можете отобразить другой объект, изменив переменную, которую шаблон использует в своей первой строке.

person Tim    schedule 19.05.2013