Ruby on Rails の非コントローラー クラスからパラメータを取得するにはどうすればよいですか
概要
この関数は非コントローラークラスにあります
def self.request(req_num, time)
token = XsrfToken.last['token']
db_parser = FetchDbParser.new
used_url = ENUM_URLS[req_num]
p token
conn = Faraday.new(
url: "#{BASE}#{used_url}",
headers: { 'Content-Type' => 'application/json', 'XSRF-TOKEN' => token }
)
response = conn.post do |req|
req.body = { stationCodes: params[:id], collectTime: time }.to_json
end
res = JSON.parse(response.body)
return unless res['success']
parser_caller(req_num, res, db_parser)
end
ここでパラメータを取得する必要があります req.body = { stationCodes: params[:id],collectTime: time }.to_json ですが、それは未定義です
また、ApplicationController クラスでメソッドを作成しようとしました。これは、非コントローラ クラスから呼び出され、このパラメータを返すことになっていましたが、別のエラーが発生しました。
`params': undefined method `filtered_parameters' for nil:NilClass (NoMethodError)
解決策
params はコントローラーの概念であり、コントローラー アクションのコンテキストでのみ使用できます。
別のオブジェクトの params の値が必要な場合は、params または少なくとも必要な値をオブジェクトに明示的に渡す必要があります。
たとえば、コントローラーが次のようになっている場合
def method_name
YourClass.request(req_num, time)
end
self.request メソッドで params[:id] の値が必要な場合は、次のようにコントローラ メソッドに変更する必要があります。
def method_name
YourClass.request(req_num, time, params[:id])
end
このようにリクエストしてください
def self.request(req_num, time, id_from_params) #<= see here
token = XsrfToken.last['token']
db_parser = FetchDbParser.new
used_url = ENUM_URLS[req_num]
p token
conn = Faraday.new(
url: "#{BASE}#{used_url}",
headers: { 'Content-Type' => 'application/json', 'XSRF-TOKEN' => token }
)
response = conn.post do |req|
req.body = { stationCodes: id_from_params, collectTime: time }.to_json #<= and here
end
res = JSON.parse(response.body)
return unless res['success']
parser_caller(req_num, res, db_parser)
end