Rails5で
app/models/event.rb
内のメソッドで変数を定義しました。
それをコントローラー内で下記のように使用したいです。
ruby
1#app/controllers/events_controller.rb 2 def create 3 @event = Event.new() 4 @event.probe_data_investigate 5 send_data 6 end 7 8 def send_data 9 Spark.new().webex_rooms_get 10 entry = Entry.new() 11 entry.entry_data_in_txt 12 entry.exit_data_in_txt 13 entry.webex_send_txt 14 15 entry.entry_exit_situation_update 16 EntryLog.new().entry_exit_log_save 17 end 18
上記において、
probe_data_investigateメソッドで色々は変数を定義しております
その定義した変数をsend_dataメソッド内のEntryモデルのメソッドで使用したいのですが、
それが出来ません。
グローバル変数は使わずに済む方法はないでしょうか?
回答から追記
ruby
1def create 2 @apple = new_data 3 @orenge = before_data 4 @bunana = max_data 5 ・ 6 ・ 7 ・ 8end
上記のような@appleなどの変数を下記のメソッド内で使用したいです。
ruby
1#app/models/entry.rb 2def entry_data_in_txt 3 $entry_txt = "" 4 @apple.each do |mac,time| 5 personal_info = [] 6 personal_info = @orenge[mac].map{|k,v| v.present? ? "┃ ・#{k} : #{v}" : nil}.sort 7 if personal_info.empty? 8 $entry_txt << "┣━#{mac}さんが入室しました(#{time})\n" 9 else 10 personal_info.map!{|x| x.split(",").join("\n┃ ")} 11 $entry_txt << "┣━#{mac}さんが入室しました(#{time})\n#{personal_info.join("\n")}\n" 12 end 13 end 14end 15 16#app/controllers/events_controller.rb 17 def create 18 @event = Event.new(data: params[:data]) 19 $timenow = Time.now 20 21 respond_to do |format| 22 if @event.save 23 format.html { redirect_to @event, notice: 'Event was successfully created.' } 24 format.json { render :show, status: :created, location: @event } 25 else 26 format.html { render :new } 27 format.json { render json: @event.errors, status: :unprocessable_entity } 28 end 29 end 30 31 Entry.new().probe_data_investigate 32 33 Spark.new().webex_rooms_get 34 entry = Entry.new() 35 entry.entry_data_in_txt 36 entry.exit_data_in_txt 37 entry.webex_send_txt 38 39 entry.entry_exit_situation_update 40 EntryLog.new().entry_exit_log_save 41 end 42 43
仮に別モデルの定義したものをすべてmodels/entry.rbに移動させてもコントローラーからモデルメソッド呼び出しなのでインスタンス変数でも出来ませんでした。
(コントローラーから呼び出しだからインスタンス変数では使えないからかな??)
別モデル内の変数なので、やっぱりグローバル変数が適切なような気がしてきてますがいかがでしょうか?
追記 バッチ処理した際の変数をモデルで使用したい
ruby
1#config/schedule.rb 2rails_env = ENV['RAILS_ENV'] || :development 3set :output, 'log/crontab.log' 4set :environment, rails_env 5 6every 30.minute do 7 runner "Tasks::PersonalLogArrange.execute" 8end 9 10 11# webex/lib/tasks/personal_log_arrange.rb 12require 'webex/app/models/personal_log' 13class Tasks::PersonalLogArrange 14 def self.execute 15 PersonalLog.new.arrange 16 end 17end 18 19#app/models/personal_log.rb 20 def arrange 21 array = Array.new 22 personal_log = PersonalLog.all 23 personal_log.find_each do |x| 24 hash = Hash.new 25 begin 26 test = JSON.parse(x.decrypted_data) 27 rescue => error 28 test = JSON.parse(x.data) 29 end 30 if test.keys.include?("uid") 31 test["uid"] = "#{test["uid"]}(#{x.provider})" 32 end 33 hash[x.macaddr] = test 34 array.push(hash) 35 end 36 @new_data = array.each_with_object(Hash.new{|h,k|h[k] = Hash.new}){|it,memo| 37 it.each{|mac,val| 38 memo[mac].merge!(val){|_,s,o| s + ',' + o} 39 } 40 } 41 @new_data.transform_values!{|val| val.transform_values{|v| v.to_s.split(',').uniq.join(',')}} 42 puts @new_data 43 end 44 45 def export 46 {new_data: @new_data} 47 end 48 49 attr_reader :new_data 50 51#app/controllers/events_controller.rb 52 53 def send_data 54 entry = Entry.new() 55 event = Event.new 56 event.probe_data_investigate 57 data = event.export 58 59 #追加したコード 60 personal_log = PersonalLog.new 61 new_data = personal_log.export 62 data.merge!(new_data) 63 64 entry.import(data) 65 Spark.new().webex_rooms_get 66 entry.entry_data_in_txt 67 entry.exit_data_in_txt 68 entry.webex_send_txt 69 70 entry.entry_exit_situation_update 71 entry.entry_exit_log_save 72 end 73
バッチ処理の際にインスタンス変数を渡しようにすればよいと思うのですがわかりますでしょうか?
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/09/18 08:35
2018/09/18 09:05
2018/09/19 02:02
2018/09/19 09:07
2018/09/19 09:58
2018/09/19 09:59
2018/09/19 10:01
2018/09/19 10:21
2018/09/19 10:24
2018/09/20 09:45
2018/09/20 17:03