Я портирую приложение из Merb 1.1 / 1.8.7 на Rails 3 (beta) / 1.9.1, которое использует ответы JSON, содержащие фрагменты HTML, например, контейнер JSON, указывающий обновление, в пользовательской записи и обновленная строка пользователя выглядит так. В Merb, поскольку все, что возвращает метод контроллера, передается клиенту, можно собрать Hash, присвоить визуализированную частичку одному из ключей и вернуть hash.to_json (хотя это, безусловно, может быть не лучшим способом.) Похоже, что для возврата данных клиенту необходимо использовать render, а render можно вызвать только один раз, поэтому рендеринг хеша для json не будет работать из-за частичного рендеринга.
Из прочтения кажется, что можно поместить эти данные в файл представления JSON .erb с <% = render частичным%> и отобразить их. Существует ли Rails-способ решения этой проблемы (вернуть JSON, содержащий один или несколько фрагментов HTML), кроме этого?
В Merb:
Контроллер:
only_provides :json
...
self.status = 204 # or appropriate if not async
return {
'action' => 'update',
'type' => 'user',
'id' => @user.id,
'html' => partial('user_row', format: :html, user: @user)
}.to_json
в рельсах:
Контроллер:
respond_to do |format|
format.json do
render template: '/json/message-1',
locals: {
action: 'update',
type: 'user',
id: @user.id,
partial: 'user_row.html.erb',
locals: { user: @user }
}
end
end
просмотр: json / message-1.json.erb
{
"action": <%= raw action.to_json %>,
"type": <%= raw type.to_json %>,
"id": <%= raw id.to_json %>,
"html": <%= raw render(partial: partial, locals: locals).to_json %>
}