用户下载ActiveStorage Blob附件时如何更新数据库?

时间:2019-07-06 09:38:40

标签: ruby-on-rails-5 rails-activestorage

当前用户可以使用以下链接在我的应用程序中下载ActiveStorage Blob:

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    //noinspection GradleCompatible
    implementation 'com.android.support:appcompat-v7:28.0.0'
    implementation 'com.android.support.constraint:constraint-layout:1.1.3'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'com.android.support.test:runner:1.0.2'
    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
    implementation 'com.android.support:cardview-v7:28.0.0'
    implementation 'com.android.support:design:28.0.0'
    implementation 'com.google.firebase:firebase-core:17.0.0'
    implementation 'com.google.firebase:firebase-database:18.0.0'
    implementation 'com.firebaseui:firebase-ui-database:0.4.1'
    implementation 'com.android.support:recyclerview-v7:28.0.0'
}
apply plugin: 'com.google.gms.google-services'

但是,我想更新数据库中的属性,以便相关模型在首次下载文件时进行注册。该字段称为downloaded_at字段。

我做了以下尝试:

  1. 在更新模型时,将link_to> button_to更改为。
  2. 添加了适当的路线
  3. 在数据库中添加了以下代码:

    link_to 'download', rails_blob_path(pj.document.file, disposition: 'attachment')
    

但是,除了重定向到不是我想要的@proofreading_job页面之外,这没有任何作用。

以前有没有人做过,如果可以,我该如何完成这项任务。

2 个答案:

答案 0 :(得分:0)

我想您也可以尝试将动作控制器用作代理,其概念是这样的:

  1. 以您的操作下载文件
  2. 检查是否已成功下载并进行其他验证
  3. 执行清理操作(在您的情况下为#3中添加的代码)
  4. 使用send_data/send_file呈现方法将文件发送回用户

例如在您的控制器中:

def download
  file = open(params[:uri])
  validate!
  cleanup!
  send_file file.path
end

然后在您看来:

link_to 'download', your_controller_path

以上只是一个概念,对于仅预先提供伪代码,我深表歉意。

答案 1 :(得分:0)

最后,我只使用了一些JavaScript来捕获按钮的点击,如下所示:

    td = link_to rails_blob_path(pj.document.file, disposition: 'attachment'), 
         id: pj.document.id, 
   download: pj.document.file_name, 
      class: "btn btn-outline-secondary btn-sm btn-download" do
        =pj.document.file_name 
        i.fa.fa-download.ml-3 aria-hidden="true"

咖啡脚本:

  $('.btn-download').on 'click', (e) ->
    id = $(this).attr('id')
    $.ajax {url: Routes.document_path(id), type: 'PUT'}

routes.rb

resources :documents, only: [:show, :update]

documents_controller.rb:

  def update
    document = Document.find(params[:id])
    authorize([:proofreaders, document]) 
    document.update(downloaded_at: Time.current) if document.downloaded_at.nil?
    head :ok
  end

这似乎效果很好。它会更新数据库,并且用户会将文件下载到他们的计算机上。