Rails, как обновить частичное с JSON ответом на пост-запрос Ajax - PullRequest
0 голосов
/ 09 мая 2018

У меня есть сообщение ajax в моем приложении backend rails, оно должно опубликовать загрузку файла.

Опубликовать ответ с моим списком файлов в формате JSON

После этого мне нужно перезагрузить список файлов на странице просмотра detalhes.html.erb. Этот список является частичным. Вот что у меня есть:

метод контроллера:

  def upload_arquivo
    @ponto_venda = PontoVenda.find(params[:pv_id])
    nome = params[:key].split('/').last
    @arquivo = Arquivo.new(nome: nome, endereco: params[:url], s3_key: params[:key], tamanho: params[:tam], user_id: params[:u_id], tag_id: params[:tag])
    if @arquivo.save!
      ArquivoPontoVenda.create(arquivo_id: @arquivo.id, ponto_venda_id: @ponto_venda.id, fachada: false)
      response = { files: filtro_pv_arquivos, message: "O arquivo '#{nome}' foi salvo" }
    else
      response = { files: '', message: 'Ocorreu um erro ao salvar o arquivo, por favor, tente novamente' }
    end
    render json: response
  end

Мой метод поста ajax на _arquivos_upload.html.erb:

$.ajax({
    url: 'some_url,
    type: 'post', processData: false
})
.success(function(data) {
    console.log(data.files.length);
    // trying to reload partial after post request
    $('#display-arquivos').html("<%= escape_javascript(render "arquivos_buscados") %>");
});

data.files верны, мне просто нужно найти способ передать это моему частичному рендеру. Как я могу это сделать? Или, если это плохой способ сделать это, как я могу сделать лучше?

Вот где я отрисовываю свою частичную detalhes.html.erb:

<div class="card" id="display-arquivos">
    <%= render "arquivos_buscados" %>    
</div>

Я уже много чего пробовал:

github link

set .html (data.files)

использовать логику файла js.erb

Ответы [ 2 ]

0 голосов
/ 09 мая 2018

Я думаю, я бы вернул html вместо json. Затем в функции .success вызова ajax просто выполните:

$.ajax({
  url: 'some_url,
  type: 'post', processData: false
})
.success(function(data) {
  $('#display-arquivos').html(data);
});

Возможно, вам потребуется изменить действие контроллера в соответствии с:

def upload_arquivo

  ...

  if @arquivo.save!
    ArquivoPontoVenda.create(arquivo_id: @arquivo.id, ponto_venda_id: @ponto_venda.id, fachada: false)
    @files = #populate your @files variable
    render "arquivos_buscados"
  else
    render :something_else
  end

end
0 голосов
/ 09 мая 2018

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

<div class="card" id="display-arquivos">
    <%= render "arquivos_buscados", locals { files: @files #add this } %>    
</div>

$('#display-arquivos').html("<%= escape_javascript(render "arquivos_buscados", locals: { files : data.files } ) %>");

...