質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Q&A

解決済

2回答

532閲覧

railsアプリケーションにrubyのプログラムを組み込みたい

hokahomu

総合スコア38

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

0グッド

0クリップ

投稿2020/01/22 05:08

編集2020/01/23 08:09

前提・実現したいこと

railsで作成しているアプリケーション内でデータベースに保存したデータを分析したいのですが、以前にデータベースではなくSDカードからデータを読み込み分析するプログラム(Ruby)があります。このプログラムをrailsのアプリケーション内に組み込む方法が知りたいです。

発生している問題・エラーメッセージ

外部のrubyプログラムをrailsに組み込み、動作させたい

調べた内容・試した内容

railsで外部のrubyプログラムを動作させたい
上記の質問での回答やそのコメントでclass化するや、methodにするといったアドバイスをいただきましたが、たくさんのクラスからなっているrubyのプログラムをどう組み込めばいいのかというところで詰まっています

該当のソースコード

controller

1require 'net/http' 2require 'net/https' 3require 'uri' 4require 'json' 5 6class AddressController < ApplicationController 7 def show 8 params = URI.encode_www_form({token: '*********'}) 9 # URIを解析し、hostやportをバラバラに取得できるようにする 10 uri = URI.parse("apiのURL?#{params}") 11 12 @query = uri.query 13 puts "aaa" 14 # 新しくHTTPセッションを開始し、結果をresponseへ格納 15 response = Net::HTTP.start(uri.host, 16 use_ssl: true, verify_mode: OpenSSL::SSL::VERIFY_NONE, 17 #response = https.start 18 # 接続時に待つ最大秒数を設定 19 open_timeout: 5 20 # 読み込み一回でブロックして良い最大秒数を設定 21 #read_timeout: 10 22 # ここでWebAPIを叩いている 23 # Net::HTTPResponseのインスタンスが返ってくる 24 ){|https| https.get(uri.request_uri)} 25 26 puts "ccc" 27 # 例外処理の開始 28 begin 29 print "response=" 30 puts response 31 puts uri 32 # responseの値に応じて処理を分ける 33 case response 34 # 成功した場合 35 when Net::HTTPSuccess 36 # responseのbody要素をJSON形式で解釈し、hashに変換 37 puts "a" 38 @result = JSON.parse(response.body) 39 # 表示用の変数に結果を格納 40 for i in 0..99 do 41 @value = @result["results"][i]["value"] 42 cannel = @result["results"][i]["channel"] 43 if cannel == 0 then 44 Rawdate.create(:time => @value) 45 else 46 Rawdate.create(:distance => @value) 47 end 48 end 49 @size = @result["meta"]["count"] 50 51 52 # 別のURLに飛ばされた場合 53 when Net::HTTPRedirection 54 @message = "Redirection: code=#{response.code} message=#{response.message}" 55 # その他エラー 56 else 57 @message = "HTTP ERROR: code=#{response.code} message=#{response.message}" 58 end 59 # エラー時処理 60 rescue IOError => e 61 @message = e.message 62 rescue TimeoutError => e 63 @message = e.message 64 rescue JSON::ParserError => e 65 @message = e.message 66 rescue => e 67 @message = e.message 68 end 69 end 70end
上記のcontrollerでデータベースに保存したデータを、下記のプログラムで処理したいと考えております。 すべてのプログラムを載せてしまうと膨大な量になってしまうため、mainだけ抜粋して載せます。

main

1require_relative 'read/read_main' 2require_relative 'object_data/object_data' 3require_relative 'number_data/number_data_main' 4require_relative 'S_D_data/S_D_data_main' 5require_relative 'transit_time/transit_data_main' 6require_relative 'range_data/range_main' 7require_relative 'count/count_main' 8require_relative 'write/write_main' 9 10file_read = Read_main.new 11write = Write_main.new 12#p file_read.start_time 13#p file_read.sensing_dis 14#p file_read.data_cnt 15p file_read.main 16 17object_data = Object_data.new(file_read.main, file_read.data_cnt) 18print "\n---------------object_data------------------\n" 19#p object_data.main 20object_data.drow 21print "\n--------------------------------------------\n" 22 23 24q_flag = 0 25 26count = Count_main.new(object_data.main) 27 28#p count.count_number #データの個数 29#exit 30 31 32 33count.count_number.times do |i| 34 printf("\nデータ番号: %d\n", i) 35 weight = 0 36 number_data = Number_main.new(object_data.main) 37 #p number_data.weight(i).class 38 #p number_data.weight(i) 39 if number_data.weight(i).class == Float 40 printf("データ数重み: %f\n", number_data.weight(i)) 41 weight += number_data.weight(i) 42 else 43 printf("データ数重み: ?\n") 44 q_flag = 1 45 end 46 47 if q_flag == 0 48 s_d = S_D_main.new(object_data.main) 49 #p s_d.val(0) 50 #p s_d.weight(i) 51 if s_d.weight(i).class == Float 52 printf("標準偏差重み: %f\n", s_d.weight(i)) 53 weight += s_d.weight(i) 54 else 55 printf("標準偏差重み: ?\n") 56 q_flag = 1 57 end 58 end 59 60 if q_flag == 0 61 transit_time = Transit_main.new(object_data.main) 62 #p transit_time.drow(0) 63 if transit_time.weight(i).class == Float 64 printf("経過時間重み: %f\n", transit_time.weight(i)) 65 weight += transit_time.weight(i) 66 else 67 printf("経過時間重み: ?\n") 68 q_flag = 1 69 end 70 end 71 72 if q_flag == 0 73 range = Range_main.new(object_data.main) 74 #p range.val(0) 75 if range.weight(i).class == Float 76 printf("距離範囲重み: %f\n", range.weight(i)) 77 weight += range.weight(i) 78 else 79 printf("距離範囲重み: ?\n") 80 q_flag = 1 81 end 82 end 83 84 85 if q_flag == 0 86 printf("重み合計: %f\n", weight) 87 else 88 printf("重み合計: ?\n") 89 end 90 91 write.count_car_or_human(weight,q_flag) 92 93 q_flag = 0 94 95end 96 97#write.count_ans 98printf("\n---------------------result------------------------\n") 99printf("車であろう確率: %f %\n",write.probability_car(count.count_number)) 100printf("人であろう確率: %f %\n",write.probability_human(count.count_number)) 101printf("判定不可能なオブジェクトの確率: %f %",write.probability_q(count.count_number)) 102printf("\n---------------------------------------------------\n") 103 104printf("\n---------------------result------------------------\n") 105printf("全体のオブジェクト個数: %d \n",count.count_number) 106printf("車であろう個数: %d \n",write.count_car) 107printf("人であろう個数: %d \n",write.count_human) 108printf("判定不可能なオブジェクトの個数: %d ",write.count_q) 109printf("\n---------------------------------------------------\n") 110

補足情報(FW/ツールのバージョンなど)

ruby 2.6.5.p114
rails 6.0.2.1
sqlite3 3.30.1

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

独立したプログラムですと

  1. 起動時にコマンドラインなどからどう動作するのか、の条件を取込み設定する
  2. 処理する
  3. 後始末する

とまあ大きく3つに分けられます。

classがいくつあろうと、2)の入り口は一つでしょうから、
0)DBからデータを取り出し、2)が動くのに使える形に整える
1') 動作条件を設定する
2)を呼ぶ
3')DBに書き出す
という具合に使えるように、2)の部分を切り出してみてください。

なお、このclass全体は vender とか lib とかに置くようにすると元々のRailsアプリと混乱しません。

追記
まずは main.rb を書きなおして
実質の実行文を

初期化 計算 出力 end

の3行にしてしまい

def 初期化 end def 計算 end def 出力 end

に切り出すところをやってみてください。

次に、計算に使うデータを 今は何からかな? それをデータをDBから取り出すのに変更するわけですが、初期化でその部分だけをさらに method にして、DBからのに置き換える準備を行う

投稿2020/01/22 05:35

編集2020/01/22 08:39
winterboum

総合スコア23284

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hokahomu

2020/01/23 08:15

とても分かりやすい回答、追記ありがとうございます! initialize,calculation,outputというメソッドを作成し、 mainの「count.count_number.times do |i|」より上をinitialize、 「count.count_number.times do |i|」ループをcalculation、 ループ以下をoutputといった感じで作ってみたのですが認識はあっているのでしょうか? また、データの取り出しはテキストファイルからRead_partというクラスで行っているのですが、その中身をDBから取り出すようなプログラムに改変するということでいいのでしょうか?
winterboum

2020/01/23 08:35

大体そんなところでしょう(分け方) データの取り出しも考え方はそんなところですが、改変ではなく、別の名前のmethodにし、File,DB どちらからデータを読むのか、に応じて使い分ける方が良いです。 Fileから読む計算もまだやるのでしょうから、メインな計算部分は共有できるようにしておくのがよいです。 あ、、、 共通して使う部分は、Railsの中に書き込むよりも、ruby のlibの中においてrequireするのでないと、共有できないですね
hokahomu

2020/01/23 09:30

返信ありがとうございます。 データの取り出しに関しては今後一切をdbから行うので、完全に書き換えてしまおうと思っています。 実装に関してですが、このmainとrequireされているファイルをrailsのlib下において、controllerでrequireして、methodを呼べばいいのでしょうか?
winterboum

2020/01/23 09:47

完全に書き換えてしまうのでしたら、中に組み込んでしまってもよいかと。 どこにおいても取り込めますが、その計算の性格によって置き場所を考えてください その計算が 本来はこのRailsアプリのやるべきこと であるなら models/consernsに
hokahomu

2020/01/27 23:56

なるほどです、ありがとうございます。 concerns下にmoduleで作っておいてみます。
guest

0

通常、移植とは異なるプラットフォームでも動作を可能とさせるための
作業をさします。
わかりやすく言うなら、iphoneで動作しているソフトウェアをアンドロイド端末でも
動作させるというような意味合いの時、移植作業とよびます。

発生している問題・エラーメッセージさえ何もない状態で何が問題なのかも
明確に記載されていません。

まずは、表題から見直し、なにをどうしたいのか整理し
実際に作業を行い、こういう事を実現したい所
やってみたら、hogehogeというメッセージがでて
実現したいことが出来なかった。
という様な文面にしたほうが、回答を得やすいとおもいます。

現状、何が問題で、なにがしたいのかわかりませんでした。

投稿2020/01/22 05:22

nanami12

総合スコア1015

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hokahomu

2020/01/23 08:06

回答ありがとうございます。今回私の認識不足で「何が問題で、何がしたいのかわからない」といった状況を招いてしまったことを大変申し訳なく思っております。 私自身、rails,rubyともに最近学習しはじめた者でありまして、調べ物をしてわからなければすぐ聞けばいいかという思いで質問をさせていただきました。今後はもう少し自分で問題を精査し、本当にわからないとなったところで質問をしようと思います。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問