【问题标题】:Rails how to update partial with json response from an ajax post requestRails 如何使用来自 ajax 发布请求的 json 响应更新部分内容
【发布时间】:2018-05-09 14:42:11
【问题描述】:

我有一个 ajax 帖子到我的后端 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

我在_arquivos_upload.html.erb的ajax发布方法:

$.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)

use js.erb file logic

【问题讨论】:

    标签: javascript ruby-on-rails ajax request partial-views


    【解决方案1】:

    看起来不错。我建议修改您的局部变量以接受局部变量,然后在渲染局部变量时显式传递它。

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

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

    【讨论】:

    • 我试试这个,但 ruby​​ 标记内的 data.files 返回错误 = 未定义的局部变量或方法 `data'。
    • @LucasAndrade 任何想法,你是如何解决这个错误的?
    【解决方案2】:

    我想我会返回 html 而不是 json。然后,在ajax 调用的.success 函数中,执行以下操作:

    $.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
    

    【讨论】:

    • 我只是试试这个,我的列表消失了。在这部分中,当我第一次加载页面 html.erb 时,我的文件是名为 @files 的变量
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-12-30
    • 2016-06-27
    • 2020-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多