用户可以通过链接下载报告,链接旁边是一个文本标记,指示他们是否已经下载了文件 - “未读”警报。我有一个部分显示报告索引中的单个项目:
<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在帮助程序中使用该方法。
答案 0 :(得分:0)
您可以在两个单独的操作(下载和ajax调用)中拆分操作,并编写一些侦听下载点击的前端(javascript)代码,并触发对update_read_status操作的第二个ajax调用(例如通过jquery)