###1 開発環境
ruby 2.4.1p111
Rails 5.2.3
mysql Ver 14.14
###2 背景
Active Storageを使用して、テキストファイルを、storage/以下にアップロードし、そのファイルをコントローラーから呼び出して、別のプログラムに組み込んで計算結果を取得する機能を実装している。
参照サイト:【Rails 5.2】 Active Storageの使い方
###3 やったこと
参照サイトの内容をほぼ真似させていただいて、ファイルのアップロードについては完了している。
しかし、アップロードしたファイルをstorage/以下から取得してくることができておらず、参照サイトの方法から私が予測できたことが、予測とは異なっていたため、困っている。
####3-1 参照サイトを丸パクリしたコード
Controller
Rails
1class ContextsController < ApplicationController 2 def new 3 @context = Context.new 4 end 5 6 def create 7 @context = Context.create params.require(:context).permit(:file_name) 8 redirect_to @context 9 end 10 11 def show 12 @context = Context.find(params[:id]) 13 end 14end
View
Rails
1<% if @context.file_name.attached? %> 2 <%= image_tag @context.file_name %> 3<% end %>
####3-1-1 参照サイトを丸パクリした結果
・画像ファイルをアップデートすると、画像が表示される。
予想したこと
・image_tagの引数となっている@context.file_nameは絶対パスに等しい情報を持っているのではないか?
###3-2 自分で書き直し、試したこと。およびその時のコード
Controllerに変更点はない。
View
Rails
1<% if @context.file_name.attached? %> 2 <%= `cat #{@context.file_name}` %> 3<% end %>
なぜこのコードを書いたか?
→**「3-1-1」**で画像ファイルがViewの画面で問題なく表示されたことと、image_tagの引数に、今まで絶対パスを記述してきた経験を合わせて、@context.file_nameには絶対パスに近い情報が入っていると予想した。
よって、テキストファイルであれば、catコマンドの引数として与えれば、中身が表示できるはず!と考えたが、できなかった。
なぜできないのかを確かめるために、@context.file_nameを出力したところ、
terminal
1#<ActiveStorage::Attached::One:0x007faaa59085b0>
と出力され、絶対パスが入っているわけではなかった。
###3-2-1 自分で書き直し、試したこと。およびその時のコードその2
Controller側の中でcatコマンドをしてみた。
Controller
Rails
1class ContextsController < ApplicationController 2 def new 3 @context = Context.new 4 end 5 6 def create 7 @context = Context.create params.require(:context).permit(:file_name) 8 # redirect_to :action => 'kegg_result' 9 redirect_to @context 10 end 11 12 def show 13 @context = Context.find(params[:id]) 14 logger.info("--------------") 15 logger.info(@context.file_name) 16 if @context.file_name.present? 17 @content = `cat #{@context.file_name}` 18 end 19 end 20end
View
Rails
1<%= @content %>
結果
→localhostを待機しています。と左下に表示が出ていて、ブラウザはずっと読み込み中。おそらく、上手く入っていないのであろう。
###最後に
Railsガイドこちらを参照してみたが、ファイルのstorage/からテキストファイルをgetする方法がいまいちわからないです。
私としては、image_tagで画像が表示できるのに、ファイルは取得してこれないことに、頭の中が「?????」となっております。
識者の方、教えていただけると嬉しいです。よろしくお願いします。
###asm様のご提示いただいた内容の結果
Ruby
1 def show 2 @context = Context.find(params[:id]) 3 if @context.file_name.present? 4 @context_file = @context.file_name.download 5 @stdin = `cat #{@context_file}` 6 end 7 end
すみません、提出するファイルによっては、catでうまく出力ができないみたいなので少し時間かかります。
提示していただいた内容についてはこれで大丈夫であると思われます。
今日中に完成させます。
case1
permission deniedがログのエラーとして発生しているようです。
https://qiita.com/takuyanin/items/18590600d077df707923
少し勉強します。
→これは使用したテキストファイルに制限がかかっていることが原因でした。
case2
自分で作成したテキストファイルをアップロードしてみました。
作成したファイルに書いた文言
text.txt
1こんにちは 2初めまして 3おはよう 4こんばんは 5お疲れ様です 6どうにか 7プログラムが 8動いたみたいだ 9一安心だね
catコマンドはなんだか問題ありそうだったので、python3で簡単なプログラムを作成して、これで動かしてみました。
結果→incompatible character encodings: UTF-8 and ASCII-8BIT
エラー出てますね。これは別問題なのでどうしましょうと言った感じです。
でも、ターミナルでは出力が出ていました。しかし、Viewファイルには出力出ていないですね。。
こんにちは 初めまして おはよう こんばんは お疲れ様です どうにか プログラムが 動いたみたいだ 一安心だね
case3
別の(結果をお見せすることができない)テキストファイルをinputすると、ターミナルにて、その内容がログに出力されていました。
ここで使用したファイルは卒論にて使用するためのファイルなのでお見せできません。申し訳ないです。
しかし、とりあえずファイルをpython3で作成したプログラムに渡すことができたので、1つの区切りとすることができました。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2019/11/15 08:45
退会済みユーザー
2019/11/15 08:55
退会済みユーザー
2019/11/15 09:02
2019/11/15 09:27
退会済みユーザー
2019/11/15 09:50