##開発環境
macOS(catalina version10.15.1)
Ruby 2.4.1
Ruby on Rails 5.2
##背景
入力画面の入力値に依存して、publicディレクトリ以下にあるRubyプログラムを条件分岐して実行し、その結果を取得してインスタンス変数に代入し、結果画面に表示するということをやっています。
##わからないこと
コントローラーで外部コマンドからRubyプログラムを実行する際に、実行した結果がインスタンス変数に代入されておらず、原因がわからないこと。なお、質問しながら自分でも調査を進めています。
今回、確かめているコードは以下の条件分岐以下の処理になります。
Ruby
1 if user_location == "x駅・y駅" && time_3 != 6 && time_3 != 7;
##ソースコード
Ruby
1def result 2 #日時、曜日関係 3 time = Time.now 4 time_1 = time.hour #Ex.0,1,2,3,4,5,/~/,19,20,21,22,23 5 time_2 = time.min #Ex,0,1,2,3,4,/~/55,56,57,58,59 6 time_3 = time.wday#[1:Mon,2:Tue,3:Wed,4:Thurs,5:Fri,6:Sat,7:Sun] 7 @time_4 = time_1.to_s + ':' + time_2.to_s 8 9 #paramsから取得する現在地情報、つまり、駅名 10 user_location = params[:present_location] 11 if user_location == "x駅・y駅" && time_3 != 6 && time_3 != 7; 12 @result = `ruby /Users/~省略~/public/test.rb #{time_1} #{time_2}` 13 p "--------------------------------------" 14 p $? 15 p "--------------------------------------" 16 #↑上記コマンドが正常に実行されているかを確認するために出力させた。 17 18 19 elsif user_location == "z駅" && time_3 != 6 && time_3 != 7; 20 @result = `ruby /Users/~省略~/public/test_2.rb #{time_1} #{time_2}` 21 else; 22 @result = "平日以外は本アプリケーションの適応範囲外となります。" 23 end 24 25 end
##まず、コマンドは正常に動いているのか??
terminal
1p $? 2#<Process::Status: pid 12064 exit 1>
参照:Ruby 2.6.0 リファレンスマニュアル ライブラリ一覧 組み込みライブラリ Process::Statusクラス
上記によると、出力されたものは、どうやら以下のようなものに合致しそう・・・?
[引用]
正常終了の時 <Process::Status: pid=18262,exited(nnn)>
exitが過去形ではないのが気になるが・・まあ、プログラムは正常に動いていそうだ。
と判断していますが、これが間違いであればご指摘願います。
→確認方法がこれでは不十分!であるとかであればバシバシご指摘ください。
##「まず、コマンドは動いているのか?」が正しいと仮定する。
Rails側の処理に問題がないと仮定するのであれば、次に考えられる原因は、プログラムの中身で返しているものがおかしい可能性が考えられる。
#####動かしているプログラムのソースコード
Ruby
1can_take = [] #試しているのは、空の状態 2can_take_2 = [] #同様に空の状態 3 if can_take.empty? && can_take_2.empty?; 4 return '今日のバスはもうありません。' 5 elsif !can_take.empty? && can_take_2.empty?; 6 return 'x駅発大学行きバスダイヤです。y駅発はもうありません。',can_take_takasaka 7 elsif !can_take.empty? && !can_take_2.empty?; 8 return can_take_takasaka,can_take_kita_sakado 9 else; 10 return takasaka_daiya,kita_sakado_daiya 11 end
上記Rubyプログラムソースコードの、
Ruby
1return '今日のバスはもうありません。'
が、コントローラーの、
Ruby
1@result = `ruby /Users/~省略~/public/test.rb #{time_1} #{time_2}`
@resultに入っていて欲しい。が、入っていない(泣)ので、returnについてググることを決定する。
##最後に
ここまでの過程では、returnの使い方に問題があるのではないか?というのが論理的に原因となりそうである。しかし、returnについてググっても情報収集に時間がかかりそう、且つ、ここまでのデバッグで少々疲れてしまったので、こちらでお力を貸していただければと思います。
よろしくお願いします。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2019/12/11 14:52
2019/12/11 15:04
退会済みユーザー
2019/12/11 15:12
2019/12/11 15:19
退会済みユーザー
2019/12/11 15:25 編集
2019/12/11 15:33
退会済みユーザー
2019/12/11 15:39 編集
2019/12/11 15:42
退会済みユーザー
2019/12/11 15:47
退会済みユーザー
2019/12/11 15:47
2019/12/11 16:49