Techioz Blog

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