カテゴリー : Ruby on Rails

[Ruby on Rails] 多対多の関連テーブルの作成方法

Ruby on Rails にて、多対多の関連テーブルの作成方法をメモ。

「Rails3レシピブック」の[076]「関連をまたいだ関連を設定する」を参照する。

Railsの多対多で関連テーブルの操作色々 – Tech<3 by 榊祐介 - s21g はてなブックマーク - Railsの多対多で関連テーブルの操作色々 - Tech<3 by 榊祐介 - s21g

[Ruby] Rails(ActiveRecord)の多対多関連 – @yuumi3のお仕事日記 はてなブックマーク - [Ruby] Rails(ActiveRecord)の多対多関連 - @yuumi3のお仕事日記

Railsで多対多のモデルを簡単に扱えるhas_many :through – このブログは証明できない。 はてなブックマーク - Railsで多対多のモデルを簡単に扱えるhas_many :through - このブログは証明できない。

Ruby on Rails : テーブル間リレーションシップ – WebOS Goodies はてなブックマーク - Ruby on Rails : テーブル間リレーションシップ - WebOS Goodies

[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