カテゴリー : Ruby on Rails

[Ruby on Rails] seed データの追加や管理をカンタンにしてくれる seed-fu の使い方

Ruby on Rails で seed データの追加や管理をカンタンにしてくれる seed-fu gem が便利なのでご紹介します。

使い方は db/fixtures 以下に users.rb とかいうファイル名で、簡単には下記のような感じで書きます。

db/fixtures/users.rb

User.seed do |s|
  s.id    = 1
  s.login = "jon"
  s.email = "jon@example.com"
  s.name  = "Jon"
end
 
User.seed do |s|
  s.id    = 2
  s.login = "emily"
  s.email = "emily@example.com"
  s.name  = "Emily"
end

全ての seed ファイルからインポートするには、単に

rake db:seed_fu

を実行すればよいです。

ファイルやモデル別にロードするには、下記のような感じで rake タスクを実行する。

rake db:seed_fu FIXTURE_PATH=path/to/fixtures
rake db:seed_fu FILTER=users,articles

当然だが Ruby コードが書けるので、こんな感じに CSV から DB へインポートみたいなことも書ける。

db/fixtures/users.rb

require 'csv'
 
csv = CSV.read('db/fixtures/users_master.csv')
 
csv.each_with_index do |user, i|
  # skip a label row
  next if i === 0
 
  name = user[0]
  age  = user[1].to_i
 
  User.seed do |s|
    s.id   = i
    s.name = name
    s.age  = age
  end
end

地味に便利ですね。

参考情報

[Ruby on Rails] find で ActiveRecord::RecordNotFound

Rails にて find メソッドで id のみを引数で渡して、結果レコードが0件の場合、ActiveRecord::RecordNotFound の例外が発生してしまいます。

例外処理をするもよし。

rescue ActiveRecord::RecordNotFound

find_by_id を使えば、結果が0件の場合 nil が返ってくるので、find_by_id を使うもよし。

【参考】

findよりfind_by_idでActiveRecord::RecordNotFoundを回避する – パンプキンスパイスラテ はてなブックマーク - findよりfind_by_idでActiveRecord::RecordNotFoundを回避する - パンプキンスパイスラテ

[Ruby on Rails] Rails.env で production/development 環境か判定する

Ruby on Rails にて production/development 環境などの判定は Rails.env で行います。

Rails.env を使った production/development 環境判定のサンプルコード

if Rails.env == 'production'
  // production
elsif Rails.env == 'staging'
  // staging
elsif Rails.env == 'development'
  // development
elsif Rails.env == 'test'
  // test
end

こういう書き方もできるみたいです。

puts "Rails.env is production" if Rails.env.production?

以上です。

[Heroku][Rails] New Relic アドオンのインストール方法 [Ceder Stack]

Heroku にて、Ruby on Rails 3.2.5 で動いているアプリに New Relic アドオンをインストールしたので手順をメモ。

Cederスタックで使う場合は、単純にアドオン入れるだけでは使えないっぽいです。

以下、New Relic のインストール手順です。

■ New Relic アドオンを追加する

$ heroku addons:add newrelic:standard

■ Gemfile に newrelic_rpm を追加する

group :production do
  gem 'newrelic_rpm'
end

■ bundle install を実行する

$ bundle install --without production

■ newrelic.yml をダウンロードして config 以下に設置する

$ curl https://raw.github.com/gist/2253296/newrelic.yml > config/newrelic.yml

■ Heroku へデプロイ

$ git commit -m "Added New Relic Plugin"
$ git push heroku master

以上です。

【参考】

New Relic | Heroku Dev Center はてなブックマーク - New Relic | Heroku Dev Center

[Heroku] Rails 3.2 アプリを git push すると rake assets:precompile でエラーが出るときの対処法

Heroku にて、Rails 3.2 アプリを git push すると rake assets:precompile でエラーが出るときの対処法をメモ。

■ エラー内容

—–> Preparing app for Rails asset pipeline
Running: rake assets:precompile
rake aborted!
could not connect to server: Connection refused
Is the server running on host “127.0.0.1” and accepting
TCP/IP connections on port 5432?
Tasks: TOP => environment
(See full trace by running task with –trace)
Precompiling assets failed, enabling runtime asset compilation
Injecting rails31_enable_runtime_asset_compilation
Please see this article for troubleshooting help:
http://devcenter.heroku.com/articles/rails31_heroku_cedar#troubleshooting

解決方法は、下記の設定を application.rb に追加してやるだけでOKです。

■ config/application.rb

    # For Heroku
    config.assets.initialize_on_precompile = false

以上です。

【参考】

Rails 3.1+ Asset Pipeline on Heroku Cedar | Heroku Dev Center はてなブックマーク - Rails 3.1+ Asset Pipeline on Heroku Cedar | Heroku Dev Center

Heroku に Rails 3.1 アプリを git push すると rake assets:precompile でエラーが出るときの対処法 – LazyLoadLife はてなブックマーク - Heroku に Rails 3.1 アプリを git push すると rake assets:precompile でエラーが出るときの対処法 - LazyLoadLife

macを買って、今すぐherokuでruby1.9.3 + rails3.2しよう! – ppworks blog はてなブックマーク - macを買って、今すぐherokuでruby1.9.3 + rails3.2しよう! - ppworks blog

[Ruby on Rails] Amazon SES (Simple Email Service)の設定方法

Ruby on Rails 3.2.5 にて、Amazon SES (Simple Email Service)を使ってメール送信ができるようにする設定方法をメモ。

■ config/environments/production.rb

  # Amazon SES
  config.action_mailer.delivery_method = :smtp
  config.action_mailer.default_url_options = { host: 'your-domain.example.com' }
  config.action_mailer.raise_delivery_errors = true
  config.action_mailer.smtp_settings = {
    :address              => "email-smtp.us-east-1.amazonaws.com",
    :port                 => 465,
    :domain               => 'your-domain.example.com',
    :user_name            => 'XXXXXXXXXXXXXXXXXX',
    :password             => 'SGNIHinBVUSHLGHVIUSHIRHIIHFIL',
    :authentication       => :plain
  }

■ config/initializers/amazon_ses.rb

module Net
  class SMTP
    def tls?
      true
    end
  end
end

■ Gemfile

# Amazon SES
gem "aws-ses", "~> 0.4.4", :require => 'aws/ses'

drewblas/aws-ses · GitHub はてなブックマーク - drewblas/aws-ses · GitHub

以上です。

【参考】

Amazon SES SMTP Emails using Rails 3.1 in Three Easy Steps | | ReadyPulse BlogReadyPulse Blog はてなブックマーク - Amazon SES SMTP Emails using Rails 3.1 in Three Easy Steps | | ReadyPulse BlogReadyPulse Blog

EOFError error trying to use Amazon SES via SMTP with Rails 3.1.3 – Stack Overflow はてなブックマーク - EOFError error trying to use Amazon SES via SMTP with Rails 3.1.3 - Stack Overflow

Amazon SES(Simple Email Service)でメールを送ってみなイカ? | Pocketstudio.jp log3 はてなブックマーク - Amazon SES(Simple Email Service)でメールを送ってみなイカ? | Pocketstudio.jp log3

Amazon SESでメールを送ったときにGmailでvia email-bounces.amazonses.comって表示されないようにする – Startup Reality はてなブックマーク - Amazon SESでメールを送ったときにGmailでvia email-bounces.amazonses.comって表示されないようにする - Startup Reality

Amazon’s Simple Email Service on rails using aws-ses and devise – Tee Parham’s posterous はてなブックマーク - Amazon's Simple Email Service on rails using aws-ses and devise - Tee Parham's posterous

一番いいメール配信を頼む « サーバーワークス エンジニアブログ はてなブックマーク - 一番いいメール配信を頼む « サーバーワークス エンジニアブログ

[Ruby on Rails] ActiveRecord で行ロックをかける方法(楽観的ロック、悲観的ロック)

Ruby on Rails にて、ActiveRecord で行ロックをかける方法を調べたので、参考にした記事をメモ。

ロックの方法は、大きく分けて「楽観的ロック」と「悲観的ロック」の2つがあります。

■ 楽観的ロック

ずくなし。 : Ruby on Railsで楽観的ロックをかける – livedoor Blog(ブログ) はてなブックマーク - ずくなし。 : Ruby on Railsで楽観的ロックをかける - livedoor Blog(ブログ)

テストの実行環境の違いを意識する – ザリガニが見ていた…。 はてなブックマーク - テストの実行環境の違いを意識する - ザリガニが見ていた...。

■ 悲観的ロック

Railsで悲観的ロックできないの? – LazyLoadLife はてなブックマーク - Railsで悲観的ロックできないの? - LazyLoadLife

■ 両方(楽観的ロック・悲観的ロック)

ActiveRecordで行ロックをかける方法 | KRAY Inc はてなブックマーク - ActiveRecordで行ロックをかける方法 | KRAY Inc

楽観的ロックと悲観的ロック – Super Neurotic Junction はてなブックマーク - 楽観的ロックと悲観的ロック - Super Neurotic Junction

以上です。

[Ruby on Rails] Devise のログイン処理のエラーメッセージを表示する方法

Ruby on Rails にて、Devise のログイン処理のエラーメッセージを表示させるように、下記のコードを追加しました。

■ app/views/devise/sessions/new.html.haml

  -if alert
    #error_explanation
      %h2 Please check messages below:
      %ul
        %li=alert

以上です。

【参考】

Rails – Devise – Error messages when signing in? – Stack Overflow はてなブックマーク - Rails - Devise - Error messages when signing in? - Stack Overflow

[Ruby on Rails] Devise で 保存失敗時に例外を発生させる update_without_password! メソッドを作成しました

Ruby on Rails の Devise にて、保存失敗時に例外を発生させる update_without_password! メソッドを作成しました。

Devise で定義されている update_without_password メソッドでは、保存処理の成功・失敗によって true, false が帰ってきます。

例外を投げる update_without_password! メソッドも定義されているのかと思いきや、無かったので作成しました。

class User < ActiveRecord::Base
  def update_without_password!(params, *options)
 
    if params[:password].blank?
      params.delete(:password)
      params.delete(:password_confirmation) if params[:password_confirmation].blank? 
    end
 
    clean_up_passwords
    update_attributes!(params, *options)
  end
end

以上です。

・参考:
deviseで現在のパスワード無しでuserを更新する – komagata
はてなブックマーク - komagata

[Heroku] WebServer を WEBrick から thin に変更する方法 – [Rails 3.x on Heroku/Cedar]

単に Heroku に Rails アプリをデプロイしただけの最初の状態では、Webサーバーは WEBrick で動いています。

$ heroku ps
Process  State         Command                            
-------  ------------  ---------------------------------  
web.1    idle for 94h  bundle exec rails server -p $PORT

Webserver

By default, your app’s web process runs rails server, which uses Webrick. This is fine for testing, but for production apps you’ll want to switch to a more robust webserver. We recommend Thin.

To use Thin with Rails 3, add it to your Gemfile:

gem 'thin'

Run bundle install to set up your bundle locally.

■ Procfile の作成・追記

web: bundle exec rails server thin -p $PORT -e $RACK_ENV
echo "RACK_ENV=development" >>.env

.gitignore に .env を無視するように追記します。

# Ignore Heroku for local config
/.env

■ Foreman のインストール

$ gem install foreman

■ Foreman の起動

Foreman を起動して、ブラウザから http://localhost:5000/ にアクセスして、確認します。

$ foreman start

■ Heroku へデプロイ

$ git add -A
$ git commit -m "use thin via procfile"
$ git push heroku

■ thin で起動しているか確認する

$ heroku ps
Process  State        Command                               
-------  -----------  ------------------------------------  
web.1    idle for 4m  bundle exec rails server thin -p $..

以上です。

【参考】

Getting Started with Rails 3.x on Heroku/Cedar | Heroku Dev Center はてなブックマーク - Getting Started with Rails 3.x on Heroku/Cedar | Heroku Dev Center

The Process Model | Heroku Dev Center はてなブックマーク - The Process Model | Heroku Dev Center

Fiberを使ってem-http-requestとかを同期的に呼び出す – daily gimite はてなブックマーク - Fiberを使ってem-http-requestとかを同期的に呼び出す - daily gimite

Issue #13: FiberError with Rails 3.1 on Heroku · mperham/rack-fiber_pool · GitHub はてなブックマーク - Issue #13: FiberError with Rails 3.1 on Heroku · mperham/rack-fiber_pool · GitHub

mperham/rack-fiber_pool · GitHub はてなブックマーク - mperham/rack-fiber_pool · GitHub