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

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

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

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

Ruby on Rails

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

Q&A

解決済

1回答

353閲覧

rails:models/concernにあるrubyファイルが動かない

hokahomu

総合スコア38

Ruby

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

Ruby on Rails

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

0グッド

0クリップ

投稿2020/02/17 14:15

編集2023/11/14 11:40

前提・実現したいこと

railsで作成しているアプリケーション内で、concern置いているプログラムを通してデータベースにデータを保存したい。

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

concern下のプログラムが動かず、viewでNoMethodErrorが発生しています。

NoMethodErrorのエラーコード

ActionView::Template::Error (undefined method `each' for nil:NilClass): 1: <head> 2: <meta http-equiv='refresh' content='10'> 3: </head> 4: <h1>title</h1> 6: <p> 7: <% @value.each do |rawdate| %> 8: [distance] <%= rawdate.distance %> 8: [time] <%= rawdate.time %><br> 9: <% end %> 10: <% @resultvalue.each do |result| %> 11: [ishuman] <%= result.ishuman %> 12: [iscar] <%= result.iscar %> 13: <% end %> app/views/address/show.html.erb:11 Showing D:/rails/application/app/views/address/show.html.erb where line #11 raised: undefined method `each' for nil:NilClass

調べた内容・試した内容

concern内のプログラムでresultテーブルにデータを入れたり、子クラスの中でrawdataテーブルからデータを取り出したりするプログラムを書きました。concern下のプログラムがcontroller内のinclude Processで動作してないと思われるためにviewでnomethoderrorが発生しています。
以下にcontrollerとconcern下に置かれているProcess.rbのプログラムを載せます。

該当のソースコード

controller

1require 'net/http' 2require 'net/https' 3require 'uri' 4require 'json' 5require 'date' 6 7class AddressController < ApplicationController 8 include Process 9 def show 10 params = URI.encode_www_form({token: 'token'}) 11 uri = URI.parse("https://api.sakura.io/datastore/v1/channels?#{params}") 12 13 @query = uri.query 14 puts "aaa" 15 response = Net::HTTP.start(uri.host, 16 use_ssl: true, verify_mode: OpenSSL::SSL::VERIFY_NONE, 17 open_timeout: 5 18 ){|https| https.get(uri.request_uri)} 19 20 begin 21 case response 22 # 成功した場合 23 when Net::HTTPSuccess 24 @result = JSON.parse(response.body) 25 for i in 0..99 do 26 @value = @result["results"][i]["value"] 27 cannel = @result["results"][i]["channel"] 28 if cannel == 0 then 29 Rawdate.create(:time => @value) 30 else 31 Rawdate.create(:distance => @value) 32 end 33 end 34 @size = @result["meta"]["count"] 35 @value = Rawdate.all 36 start_main() 37 calculation() 38 output() 39 40 when Net::HTTPRedirection 41 @message = "Redirection: code=#{response.code} message=#{response.message}" 42 # その他エラー 43 else 44 @message = "HTTP ERROR: code=#{response.code} message=#{response.message}" 45 end 46 # エラー時処理 47 rescue IOError => e 48 @message = e.message 49 rescue TimeoutError => e 50 @message = e.message 51 rescue JSON::ParserError => e 52 @message = e.message 53 rescue => e 54 @message = e.message 55 end 56 end 57end

Process

1module Process 2 3 extend ActiveSupport::Concern 4 5 require_relative 'read/read_main' 6 require_relative 'object_data/object_data' 7 require_relative 'number_data/number_data_main' 8 require_relative 'S_D_data/S_D_data_main' 9 require_relative 'transit_time/transit_data_main' 10 require_relative 'range_data/range_main' 11 require_relative 'count/count_main' 12 require_relative 'write/write_main' 13 14 def start_main 15 file_read = Read_main.new 16 write = Write_main.new 17 #p file_read.start_time 18 #p file_read.sensing_dis 19 #p file_read.data_cnt 20 p file_read.main 21 22 object_data = Object_data.new(file_read.main, file_read.data_cnt) 23 print "\n---------------object_data------------------\n" 24 #p object_data.main 25 object_data.drow 26 print "\n--------------------------------------------\n" 27 28 29 q_flag = 0 30 31 count = Count_main.new(object_data.main) 32 33 #p count.count_number #データの個数 34 #exit 35 end 36 37 def calculation 38 count.count_number.times do |i| 39 weight = 0 40 number_data = Number_main.new(object_data.main) 41 if number_data.weight(i).class == Float 42 weight += number_data.weight(i) 43 else 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 weight += s_d.weight(i) 53 else 54 q_flag = 1 55 end 56 end 57 58 if q_flag == 0 59 transit_time = Transit_main.new(object_data.main) 60 if transit_time.weight(i).class == Float 61 printf("weight: %f\n", transit_time.weight(i)) 62 weight += transit_time.weight(i) 63 else 64 printf("weight: ?\n") 65 q_flag = 1 66 end 67 end 68 69 if q_flag == 0 70 range = Range_main.new(object_data.main) 71 #p range.val(0) 72 if range.weight(i).class == Float 73 printf("range: %f\n", range.weight(i)) 74 weight += range.weight(i) 75 else 76 printf("range: ?\n") 77 q_flag = 1 78 end 79 end 80 81 82 if q_flag == 0 83 printf("sum: %f\n", weight) 84 else 85 printf("sum: ?\n") 86 end 87 88 write.count_car_or_human(weight,q_flag) 89 90 q_flag = 0 91 92 end 93 end 94 95 def output 96 printf("\n---------------------result------------------------\n") 97 Result.create(:ishuman => write.count_human) 98 Result.create(:iscar => write.count_car) 99 @resultvalue = Result.all 100 101 end 102end

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

ruby 2.6.5.p114
rails 6.0.2.1
sqlite3 3.30.1

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

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

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

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

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

guest

回答1

0

ベストアンサー

view では @resultvalue を使っていますが、action showでは @result は定義していますが @resultvalue は定義していません
それが直接の原因です。

「concern下のプログラムが動かず」とありますが、どれがそのプログラムで、それを呼んでいるのはどこでしょうか?

追記
あ、includeあった。
プログラム実行部分に書かれているとかなり問題。
しかも、methodの定義だけではなくmethodを呼ぶようになっている。
これは def show が呼ばれた時ではなく、 def showを読み込んだ時に実行されてしまいます。

module Process の

start_main() calculation() output()

は削除し

class AddressController < ApplicationController include Process

とし、
今の include Process を

start_main() calculation() output()

に置き換えてください

それでも @resultvalue 未定義のエラーはでます

追記
待てよ、when Net::HTTPSuccess じゃないんじゃないか?

when Net::HTTPSuccess raise : when Net::HTTPRedirection raise : else raise : end

とでもして、どこでraiseするか確認してみてください

投稿2020/02/17 15:15

編集2020/02/20 08:56
winterboum

総合スコア23284

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

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

hokahomu

2020/02/18 06:21

このエラーの部分では見えないのですが、7行目に@valueが書かれているため定義されているという認識です。全文を載せるべきでした。 説明不足でした。concern下のプログラムはProccesで、controller内のinclude Proccesで呼び出しています。
winterboum

2020/02/18 06:39

必要なところを省略されてはわかりません。全文載せてください。 「controller内のinclude Proccesで呼び出しています。」とありますが、それも見当たりません。 「@valueが書かれているため定義されているという認識です。」@valueと@resultvalueは別物です。@valueを定義しても@resultvalueは定義されません。
winterboum

2020/02/18 06:48

「controller内のinclude Proccesで呼び出しています。」 みつかったのですが問題あり、なので回答に追記しました
hokahomu

2020/02/18 09:33

追記ありがとうございます。訂正させてもらいました。 @resultvalueが定義されていないということですが、Process.rbの方で@resultvalueに代入し、viewで表示させるといった具合にするにはどうすればよいのでしょうか?重ねての質問になってしまい申し訳ございません。
winterboum

2020/02/18 10:44

@resultvalue には何を入れたいのですか?
hokahomu

2020/02/19 02:00

@resultvalueにはResultテーブルのデータを入れたいと思っています。 Processの方でResultテーブルのishumanとiscarというカラムにデータをcreateして入れてるので、そこからResult.allでデータを入れようとしました。
winterboum

2020/02/19 03:16

Result.all が見当たりませんが
hokahomu

2020/02/19 03:37

ProcessのResult.create(:iscar => count_car)の後に記入してあると思います
winterboum

2020/02/19 04:56

ああ、ありますね。 ですと、includeの場所を変えたなら、 10: <% @resultvalue.each do |result| %> でのnilエラーは無くなったと思いますがどうでしょう
hokahomu

2020/02/19 05:17

まだ発生している状態ですね。 一度コードの方を更新しておきます。
hokahomu

2020/02/20 01:44

更新しておきましたのでよろしくお願いします!
winterboum

2020/02/20 01:47 編集

治ってないですね 回答の追記部分を直してください それで試して、でたエラーとかその時のlogとかを
hokahomu

2020/02/20 02:59

processの元々 start_main() calculation() output() だった所を class AddressController < ApplicationController include Process end に変更し、controllerのinclude Proccesを start_main() calculation() output() に変更って認識であってますよね?? もし違ってたらごめんなさい
winterboum

2020/02/20 03:07

class AddressController < ApplicationController include Process は、controllers/address_controller.rb に書いてください
hokahomu

2020/02/20 05:29

ありがとうございます。 controllers/address_controllerの start_main() calculation() output() となっている場所を class AddressController < ApplicationController include Process と変えるのはわかりましたが、concerns/process.rb内の class AddressController < ApplicationController include Process となっている場所は、 start_main() calculation() output() と変えればよいのでしょうか?
winterboum

2020/02/20 06:12

ちがいます。 controllers/address_controllerの class AddressController < ApplicationController の直下に include Process を置きます。 concerns/process.rb内の class AddressController < ApplicationController include Process end となっている場所は、3行削除
hokahomu

2020/02/20 07:23

何度もありがとうございます。修正したプログラムを本文に載せておきました。 実際これで動かしたところ、またundefined method `each' for nil:NilClassで同じエラーが起こってしまいました。
winterboum

2020/02/20 08:49

プログラムのどの部分で起きたか、という情報も載せてください。
winterboum

2020/02/20 08:57

回答追記したので、そこも確認してください
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問