deviseでサインアップした時にメールを送れるようにする

引き続き devise の話。confirmation 用のメールを送る設定。
config/environments/development.rb に次の設定を追加する。

config.action_mailer.delivery_method = :smtp
config.action_mailer.smtp_settings = {
  :address        => 'smtp.gmail.com',
  :port           => 587,
  :authentication => :plain,
  :user_name      => 'メールアドレス',
  :password       => 'パスワード'
}

とはいえ、メールアドレスやパスワードをハードコーディングするのは良くないよなあ。どうやるのがいいんだろ。

追記

メールアドレスやパスワードの設定場所は、以下のページによると config フォルダ以下に .yml ファイルを作って、config/initializers フォルダにおいたスクリプトで読み込むのがいいらしい。

 cf. Railsの設定情報 – Build INSIDER
 cf. Rails でアプリ固有の設定情報や定数を定義する – EasyRamble

そこで、次のように config/app_config.yaml と config/initializers/app_config.rb を作った。

---
development:
  email: メールアドレス
  email_password: パスワード
test:
  email: メールアドレス
  email_password: パスワード
production:
  email: メールアドレス
  email_password: パスワード
APP_CONFIG = YAML.load_file("#{Rails.root}/config/app_config.yml")[Rails.env]

ところが、これで Rails コンソールを立ち上げようとするとエラーになる。

takatoh@nightschool:~/w/lathercraft$ rails console
/home/takatoh/w/lathercraft/config/environments/development.rb:44:in block in ': uninitialized constant APP_CONFIG (NameError)
	from /home/takatoh/.rvm/gems/ruby-2.1.1/gems/railties-4.1.4/lib/rails/railtie.rb:210:in instance_eval'
	from /home/takatoh/.rvm/gems/ruby-2.1.1/gems/railties-4.1.4/lib/rails/railtie.rb:210:in configure'
	from /home/takatoh/w/lathercraft/config/environments/development.rb:1:in '
	from /home/takatoh/.rvm/gems/ruby-2.1.1/gems/railties-4.1.4/lib/rails/engine.rb:594:in block (2 levels) in '
	from /home/takatoh/.rvm/gems/ruby-2.1.1/gems/railties-4.1.4/lib/rails/engine.rb:593:in each'
	from /home/takatoh/.rvm/gems/ruby-2.1.1/gems/railties-4.1.4/lib/rails/engine.rb:593:in block in '
	from /home/takatoh/.rvm/gems/ruby-2.1.1/gems/railties-4.1.4/lib/rails/initializable.rb:30:in instance_exec'
	from /home/takatoh/.rvm/gems/ruby-2.1.1/gems/railties-4.1.4/lib/rails/initializable.rb:30:in run'
	from /home/takatoh/.rvm/gems/ruby-2.1.1/gems/railties-4.1.4/lib/rails/initializable.rb:55:in block in run_initializers'
	from /home/takatoh/.rvm/rubies/ruby-2.1.1/lib/ruby/2.1.0/tsort.rb:226:in block in tsort_each'
	from /home/takatoh/.rvm/rubies/ruby-2.1.1/lib/ruby/2.1.0/tsort.rb:348:in block (2 levels) in each_strongly_connected_component'
	from /home/takatoh/.rvm/rubies/ruby-2.1.1/lib/ruby/2.1.0/tsort.rb:418:in block (2 levels) in each_strongly_connected_component_from'
	from /home/takatoh/.rvm/rubies/ruby-2.1.1/lib/ruby/2.1.0/tsort.rb:427:in each_strongly_connected_component_from'
	from /home/takatoh/.rvm/rubies/ruby-2.1.1/lib/ruby/2.1.0/tsort.rb:417:in block in each_strongly_connected_component_from'
	from /home/takatoh/.rvm/gems/ruby-2.1.1/gems/railties-4.1.4/lib/rails/initializable.rb:44:in each'
	from /home/takatoh/.rvm/gems/ruby-2.1.1/gems/railties-4.1.4/lib/rails/initializable.rb:44:in tsort_each_child'
	from /home/takatoh/.rvm/rubies/ruby-2.1.1/lib/ruby/2.1.0/tsort.rb:411:in call'
	from /home/takatoh/.rvm/rubies/ruby-2.1.1/lib/ruby/2.1.0/tsort.rb:411:in each_strongly_connected_component_from'
	from /home/takatoh/.rvm/rubies/ruby-2.1.1/lib/ruby/2.1.0/tsort.rb:347:in block in each_strongly_connected_component'
	from /home/takatoh/.rvm/rubies/ruby-2.1.1/lib/ruby/2.1.0/tsort.rb:345:in each'
	from /home/takatoh/.rvm/rubies/ruby-2.1.1/lib/ruby/2.1.0/tsort.rb:345:in call'
	from /home/takatoh/.rvm/rubies/ruby-2.1.1/lib/ruby/2.1.0/tsort.rb:345:in each_strongly_connected_component'
	from /home/takatoh/.rvm/rubies/ruby-2.1.1/lib/ruby/2.1.0/tsort.rb:224:in tsort_each'
	from /home/takatoh/.rvm/rubies/ruby-2.1.1/lib/ruby/2.1.0/tsort.rb:205:in tsort_each'
	from /home/takatoh/.rvm/gems/ruby-2.1.1/gems/railties-4.1.4/lib/rails/initializable.rb:54:in run_initializers'
	from /home/takatoh/.rvm/gems/ruby-2.1.1/gems/railties-4.1.4/lib/rails/application.rb:300:in initialize!'
	from /home/takatoh/w/lathercraft/config/environment.rb:5:in '
	from /home/takatoh/.rvm/gems/ruby-2.1.1/gems/spring-1.1.3/lib/spring/application.rb:92:in preload'
	from /home/takatoh/.rvm/gems/ruby-2.1.1/gems/spring-1.1.3/lib/spring/application.rb:140:in serve'
	from /home/takatoh/.rvm/gems/ruby-2.1.1/gems/spring-1.1.3/lib/spring/application.rb:128:in block in run'
	from /home/takatoh/.rvm/gems/ruby-2.1.1/gems/spring-1.1.3/lib/spring/application.rb:122:in loop'
	from /home/takatoh/.rvm/gems/ruby-2.1.1/gems/spring-1.1.3/lib/spring/application.rb:122:in run'
	from /home/takatoh/.rvm/gems/ruby-2.1.1/gems/spring-1.1.3/lib/spring/application/boot.rb:18:in '
	from /home/takatoh/.rvm/rubies/ruby-2.1.1/lib/ruby/site_ruby/2.1.0/rubygems/core_ext/kernel_require.rb:55:in require'
	from /home/takatoh/.rvm/rubies/ruby-2.1.1/lib/ruby/site_ruby/2.1.0/rubygems/core_ext/kernel_require.rb:55:in require'
	from -e:1:in main'

最初の方に書いてあるけど、APP_CONFIG 定数が初期化されていない、と出てる。推測するに、config/initializers/app_config.rb よりも config/environments/development.rb (ここで APP_CONFIG を参照している)のほうが先に読み込まれるんではなかろうか。
結局、他に方法が思いつかなかったので、config/app_config.yml を config/envronments/development.rb の中で読み込むように変更した。

APP_CONFIG = YAML.load_file("#{Rails.root}/config/app_config.yml")[Rails.env]

config.action_mailer.default_url_options = { :host => 'localhost:3000' }
config.action_mailer.delivery_method = :smtp
config.action_mailer.smtp_settings = {
  :address        => 'smtp.gmail.com',
  :port           => 587,
  :authentication => :plain,
  :user_name      => APP_CONFIG["email"],
  :password       => APP_CONFIG["email_password"]
}

これでうまく動いた。

deviseでsign in/sign up/sign outへのリンク

昨日に続いて、devise の話。sign in/sign up/sign out それぞれへのリンクをつけた。こんな感じ。

<ul>
  <li style="list-style-type: none;">
    <ul>
<% if user_signed_in? %>
    </ul>
  </li>
</ul>
<ul>
  <li style="list-style-type: none;">
    <ul>
      <li><%= link_to "Sign out", destroy_user_session_path, :method => :delete %></li>
    </ul>
  </li>
</ul>
<% else %>
      <ul>
        <li style="list-style-type: none;">
      <ul>
      <li><%= link_to "Sign in", new_user_session_path %></li>
      <li><%= link_to "Sign up", new_user_registration_path %></li>
    </ul>
  </li>
</ul>
<% end %>

サインインしているときは、Sign out だけ、していないときは Sign in と Sign up へのリンクを表示する。