В Rails 3 как визуализировать HTML в ответе JSON? - PullRequest
17 голосов
/ 17 марта 2010

Я портирую приложение из 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 %>
}

Ответы [ 3 ]

26 голосов
/ 19 марта 2010

Наиболее близким к оригинальному подходу от Merb, который я смог найти в Rails, является использование # render_to_string

render json: {
  'action' => 'update',
    'type' => 'user',
      'id' => @user.id,
    'html' => render_to_string(partial: 'user_row.html.erb', locals: { user: @user })
}

Это довольно сложная проблема, возникающая при добавлении в смесь слоя шаблонов json.erb, будь то подход Rails Purist, я не могу сказать; возможно, что-то с RJS обычно используется.

3 голосов
/ 07 апреля 2011

Есть еще один вопрос, у которого есть больше решений для файлов json.erb. См. шаблону json erb не удается найти другой частичный html

0 голосов
/ 17 марта 2010
class UsersController < ApplicationController  
  respond_to :json

  def show  
    @user = User.find(params[:id])
    respond_with(@user) do |format|
      if @user.save
        format.json { render :json => @user }
      else
        format.json { render :json => @user.errors, :status => :unprocessable_entity }
      end
    end
  end
end
...