とりあえずnull

プログラミングの勉強日記

Rails 環境変数の使い方

こんな人には参考になるかも

・事前にローカルサーバーやherokuサーバーに違う変数を持たせたい

・サーバーごとに文字列を変えてpushするのがめんどうだからなんかうまくやりたい

 

 

こんなケース抱えている人に環境変数は答えてくれる!

ぬぉーーー!パスワードとかそのままソースコードに書くとセキュリティ上まずいし、かといってローカル環境で使いたいパスワード、同様にstaging環境、本番環境で使いたいパスワードも別々だから環境変えて動作確認するたびにソースコード内に書いてあるパスワード変更するのめんどくさ!っていうパターンになってしまったときに環境変数使うとすんげー便利になるとのこと。事前にサーバーに変数を与えて、その変数を利用することによってこちらはいちいち環境変える度にパスワードを変更せずにすむということ。ミスもなくなってめっちゃ便利です。

 

ちなみに個人的に環境変数が必要になった理由

僕のケース:

アプリ内のアイテムページをシェアさせたいと思い、とりあえずネットからシェアするためのコードをひぱってくる。⬇これ

<a href="http://www.facebook.com/share.php?u=http://hoge.com/item/74" class="share" onclick="window.open(this.href, 'FBwindow', 'width=650, height=450, menubar=no, toolbar=no, scrollbars=yes'); return false;"><%= image_tag("fb.png", :alt => "このコレクションをFacebookでシェアする") %></a>

この状態だと「http://hoge.com/item/74というページをシェアする」ことしかできない。つまりアイテムID:74のページしかシェアできないということだ。Rails側でitem.idをひぱってこれればURLのほうはhttp://hoge.com/item/<%= item.id %>みたいな感じにでき、each文を回すたびにそれぞれのアイテムページを取得しシェアしてくれる。まぁここまではいいよね。

んでもって「http://hoge.com」に注目していただきたい。これはまぁ通常本番環境だよね。たとえばstaging環境だと「http://staging.hoge.com」となるし、ローカル環境だと「http://localhost:3000/」みたいになる。当然アイテムページは「http://hoge.com/item/<%= item.id %>」「http://staging.hoge.com/<%= item.id %>」「http://localhost:3000/<%= item.id %>」ってな感じに3パターンに分かれる。つまりさきほど引用した

<a href="http://www.facebook.com/share.php?u=http://hoge.com/item/74" class="share" onclick="window.open(this.href, 'FBwindow', 'width=650, height=450, menubar=no, toolbar=no, scrollbars=yes'); return false;"><%= image_tag("fb.png", :alt => "このコレクションをFacebookでシェアする") %></a>

というソースコードの「http://hoge.com/」の部分を環境を変える度に変更を加えなければならなくなった。stagingに上げるときは

<a href="http://www.facebook.com/share.php?u=http://staging.hoge.com/item/74" class="share" onclick="window.open(this.href, 'FBwindow', 'width=650, height=450, menubar=no, toolbar=no, scrollbars=yes'); return false;"><%= image_tag("fb.png", :alt => "このコレクションをFacebookでシェアする") %></a>

 

と書き直さなければならないし、ローカルに上げたときは

<a href="http://www.facebook.com/share.php?u=http://localhost:3000/item/74" class="share" onclick="window.open(this.href, 'FBwindow', 'width=650, height=450, menubar=no, toolbar=no, scrollbars=yes'); return false;"><%= image_tag("fb.png", :alt => "このコレクションをFacebookでシェアする") %></a>

にしないといけない。くそめんどくさい事この上なし。しかも本番に上げたのにstaging.hoge.comのままだったーなんてざらにありそう。困る。

 

そこで環境変数を使いました。herokuのstagingApp、masterAppそれぞれに「http://staging.hoge.com/」「http://hoge.com/」、ローカルサーバーに「http://localhost:3000/」を記憶させて置いて、こんなふうにAppを動かしているサーバーから変数をひっぱってくるようにした。

<% url = ENV["URL"] %>

<a href="http://www.facebook.com/share.php?u=<%= url  %>item/<%= item.id %>" class="share" onclick="window.open(this.href, 'FBwindow', 'width=650, height=450, menubar=no, toolbar=no, scrollbars=yes'); return false;"><%= image_tag("fb.png", :alt => "このコレクションをFacebookでシェアする") %></a>

これで環境ごとに変更を加えずとも、各サーバーに設定されているENV["URL"] を参照し、 <%= url %>で出力。おかげでぶじコストとミスを抑えることができた。

 

環境変数の使い方

->設定

・ローカル

ターミナルでrailsAppがある場所まで移動し、以下のコマンドを入力(僕のケースの場合)

$ export URL ; URL="http://localhost:3000/'

※なにやらRVMつかっていないとできないとかなんとか(参考:「HerokuでWebアプリ開発を始めるなら知っておきたいこと(5) 環境変数ENV」アインシュタインの電話番号

また別のやり方で「このサーバが立ち上がっているときだけ」環境変数を設定したい場合は

$ 変数名1=値1 変数名2=値2 rails server

とやってあげるといいらしい。

 

・heroku

同じくターミナルでrailsAppまでいき、各ブランチごとに

$ heroku config:add URL="http://staging.hoge.com"

と入力。ちなみに環境変数を確認するには

$ heroku config

で出来る!

 

->使い方

App/views内の必要なところで

<% url = ENV["URL"] %>

と変数urlを設定し、

<%= url %>と必要な場所で使用すればOK〜

 

これ結構開発サービスごとに使えるから便利だね。