LoginSignup
0
2

More than 3 years have passed since last update.

Railsのコントローラー上で.envを使った環境変数を読み込めなかった時の対応

Posted at

実現したいこと:
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を取得し環境変数として設定後、記載されている実装コードを活用しファイル作成。(ニュースカテゴリー等の設定は変更)

対象ファイル:

app/controller/news_Controller.rb
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
.env
API_KEY='この中に取得したAPI_KEYを入力'

上記コードでは下記のようなエラーが発生。

エラー文:
syntax error, unexpected tCONSTANT, expecting ')'
...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として出力したりする際に利用するとのことであり、コントローラー内では記述方法は異なるとのこと。

解決策:
下記、コードを修正。
ダブルクォーテーション(")とシングルクォーテーション(')の使い方にも間違いがあった模様。

app/controller/news_Controller.rb
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

今回、エラーにハマっていたところを質問サイトにて回答を頂いたため、
同じ状況の方のご参考になればと思い、共有させて頂きます。

まだまだ未熟なため説明不足な点もございますが、
今後修正等加えて参りますので気になる点がございましたらぜひ、
ご指導、ご鞭撻のほどよろしくお願いいたします。

0
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
2