実現したいこと:
Railsのコントローラー上で、
.envのファイルに設定した環境変数を読み込んでAPIを取得したい。
環境:
Ruby 2.6.6
Rails 6.0.3.4
gemのdotenv-railsをインストール済
状況:
Ruby-on-RailsでSNSのアプリケーションを作成中にNewsApiを使用し、
Newsの情報を取得し表示する機能を実装していた。
APIKEYを.envファイルにて環境変数に置き換えて使用したかったが、
エラーが発生して読み込めなかった。
ニュース機能の実装で参考にした記事:
https://qiita.com/UTOG/items/f6438420e81b6488a508
上記執筆者様の実装方法を参考にNewsApiへ登録し、
APIKEYを取得し環境変数として設定後、記載されている実装コードを活用しファイル作成。(ニュースカテゴリー等の設定は変更)
対象ファイル:
class NewsController < ApplicationController
def index
end
def data
uri = URI.parse('http://newsapi.org/v2/top-headlines?country=jp&category=business&pageSize=15&apiKey=<%="#{ENV['API_KEY']}"%>')
json = Net::HTTP.get(uri)
moments = JSON.parse(json)
@data = moments['articles'].to_json
end
end
API_KEY='この中に取得したAPI_KEYを入力'
上記コードでは下記のようなエラーが発生。
エラー文:
...ze=15&apiKey=<%="#{ENV['API_KEY']}"%>')
... ^~~~~~~
/app/controllers/news_controller.rb:6: syntax error, unexpected ')', expecting end
...iKey=<%="#{ENV['API_KEY']}"%>')
調べたところ閉じタグがないと警告が出ており、
どうやら環境変数が読み込めていないため、
そこでコードの読み込みが止まってしまっているようあった。
試したこと:
1.環境変数を挿入していた該当のURLに取得したAPIKEYをベタ打ちで挿入
→ニュースが問題なく表示される。
2.コンソール上で環境変数を実行( 実行コード:$ ENV['API_KEY']
)
→.env内に記載していたAPIKEYが問題なく表示される。
→この時点で、
①ニュースを表示すること
②.env内での環境変数の設定はできていると予想。
コントローラーへの環境変数の組み込み方に問題があるのではと仮定。
2.環境変数の挿入方法を変更
(news.controller.rb 6行目を下記のパターンで変更 ※対象箇所周辺コードのみ抜粋)
country=jp&category=business&pageSize=15&apiKey=<%="#{ENV['API_KEY']}"%>')
country=jp&category=business&pageSize=15&apiKey=<%=ENV['API_KEY']%>')
country=jp&category=business&pageSize=15&apiKey=<"#{ENV['API_KEY']}"')
country=jp&category=business&pageSize=15&apiKey=ENV['API_KEY']')
→検索しながら上記色々なパターンを実行したものの、エラー等で読み込めない状況は変わらず。。
原因:
<% %>や<%= %>の記述はerbファイル内で使える記述であり、
erb上でRubyコードを実行したり、Rubyで定義した変数などをHTMLとして出力したりする際に利用するとのことであり、コントローラー内では記述方法は異なるとのこと。
解決策:
下記、コードを修正。
ダブルクォーテーション(")とシングルクォーテーション(')の使い方にも間違いがあった模様。
class NewsController < ApplicationController
def index
end
def data
uri = URI.parse("http://newsapi.org/v2/top-headlines?country=jp&category=business&pageSize=15&apiKey=#{ENV['API_KEY']}")
json = Net::HTTP.get(uri)
moments = JSON.parse(json)
@data = moments['articles'].to_json
end
end
今回、エラーにハマっていたところを質問サイトにて回答を頂いたため、
同じ状況の方のご参考になればと思い、共有させて頂きます。
まだまだ未熟なため説明不足な点もございますが、
今後修正等加えて参りますので気になる点がございましたらぜひ、
ご指導、ご鞭撻のほどよろしくお願いいたします。