【发布时间】:2020-12-23 07:43:25
【问题描述】:
我可以使用<%= render file: "#{Rails.root}/filepath", layout: false %> 显示特定文件的内容,但是,我需要动态访问数据库中的每个文件并获取其文件路径。
在index.html.erb视图文件中,我link_to articles_path,也就是这条路线article GET - /articles/:id(.:format) - articles#show。这意味着节目 URL 以articles/:id 结尾。我可以通过使用实例变量@article.title 和@article.id 来显示文件标题和ID。此外,我可以使用<%= link_to "View File", @article.file%> 获取下载链接,这是在显示视图页面<a href="/rails/active_storage/blobs/eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaHBCZz09IiwiZXhwIjpudWxsLCJwdXIiOiJibG9iX2lkIn19--045b71b4dec3d3bfe6cec88145761e50106c0922/test2.txt">View File</a> 中下载文件的示例链接(当我检查页面时)。但是,我不想下载文件,只是在网页上显示内容(文本)。如何动态访问文件路径?
由于这个堆栈溢出问题:How to get the filename of uploaded file in rails contoller,我尝试使用 @filename = params[:file].original_filename(在 article_controller 的 show 方法中)。我认为它不起作用。
我也尝试了<%= cdata_section(File.read(@filename)) %>(在view/show.html.erb 文件中),但我得到一个未定义的错误:nil:NilClass 的未定义方法'original_filename'
代码:
#application_record.rb
class ApplicationRecord < ActiveRecord::Base
self.abstract_class = true
end
#article.rb
class Article < ApplicationRecord
has_one_attached :file
end
#articles_controller.rb
class ArticlesController < ApplicationController
def index
@articles = Article.all
end
def show
@article = Article.find(params[:id])
end
def new
end
def create
@article = Article.new(params.require(:article).permit(:title, :text, :file))
@article.save
redirect_to @article
end
def destroy
@article = Article.find(params[:id])
@article.destroy
redirect_to articles_path
end
def article_params
params.require(:article).permit(:title, :text, :file)
end
end
我相信这些文件存储在本地 Rails DB 中的活动存储 blob 中。这是我的config/storage.yml;我们将文件存储在本地,因此文件位于我的应用根目录下的存储目录中的层次结构中
#config/storage.yml
test:
service: Disk
root: <%= Rails.root.join("tmp/storage") %>
local:
service: Disk
root: <%= Rails.root.join("storage") %>
【问题讨论】:
-
params[:file]是什么?您能否举一个显示 URL 的示例,因为通常这只是一个id被发送,但您试图像文件是参数一样调用它。您可能(没有看到)需要使用id获取文件,然后根据存储方式添加路径。文件是如何存储的?这只是在本地您需要解决这个问题还是在托管在某处的应用程序中,如果是的话,文件实际托管在哪里? -
@RockwellRice,我对我的帖子进行了更改以解决您的问题。
标签: ruby-on-rails