Ajax调用 - send_data并渲染部分 - 一个动作中的两个渲染方法

时间:2014-12-02 14:47:43

标签: ruby-on-rails ajax partials

用户可以通过链接下载报告,链接旁边是一个文本标记,指示他们是否已经下载了文件 - “未读”警报。我有一个部分显示报告索引中的单个项目:

<p id="chapter_report_index_item">
 <%= link_to "#{report.chapter_report_original_filename}", chapter_report_path(report), remote: true %>
 <%unless check_read_status?(report) %>Unread
 <%end%>
<p>

在chapter_reports_controller.rb中我有 -

def show
  set_chapter_report
  set_read_status_true(@chapter_report)
  send_data @chapter_report.chapter_report.read, filename: @chapter_report.chapter_report_original_filename
  respond_to do |format|
    format.js
  end
end

在show.js中,调用重新呈现此单个项目的部分 -

$("#chapter_report_index_item").html( "<%= j (render(partial: 'index_item', locals: {report: @chapter_report})) %>" );

您将在视图中注意check_read_status方法 - 基本上这样的想法是,当显示部分时,如果用户没有点击下载链接,则会显示未读标记。

我的问题是,我正在尝试在动作中渲染两件事:下载和部分。避免这种情况的技术是什么?

基本上,我想要一个下载文件时更改的下载按钮。

更新

我正在尝试通过javascript来帮助解决这个问题(根据下面的评论)。我的问题是send_file并且它的类似不可用作application_helper.rb中的方法

基本上我有一个对部分的jQuery调用,它只包含对下载方法的调用 -

<%= report.class.name %>
<%= report.chapter_report_original_filename %>
<%= asset_download(report) %>

在助手中 -

def asset_download(object)
  object.chapter_report_original_filename
  #send_file(object.chapter_report.read, filename:object.chapter_report_original_filename)
end

我已拨打.class.name等来查看正在通过的内容。当我取消注释send_file调用时,我收到错误 -

ActionView::Template::Error (undefined method `send_file' for #<#<Class:0x0...

我猜测该方法可用于ActionController而不是ActionView。

所以问题是 - 如何在这种情况下使控制器方法可用?或者我还能找到另一种方法吗?

根据下面的答案,

更新2 ,您可以通过渲染包含通过javascript调用的部分来调用send_file方法。您需要根据this question在帮助程序中使用该方法。

1 个答案:

答案 0 :(得分:0)

您可以在两个单独的操作(下载和ajax调用)中拆分操作,并编写一些侦听下载点击的前端(javascript)代码,并触发对update_read_status操作的第二个ajax调用(例如通过jquery)