カテゴリー : Ruby on Rails

[Ruby][FactoryGirl] Could not find a valid mapping for #<User

Ruby on Rails のプロジェクトにて、rake タスクに FactoryGirl 経由で Devise の user を作成したら、エラー出て死んだ。

■ エラーメッセージ

Could not find a valid mapping for #<User

そして、rake も rails s も rails c も何もできなくなった。

とりあえず、rvm 使っていたので、gemset を作り直すことで rake や rails s などは実行できるようになった。

しかし、User登録については、まだ解決できてない。ダレカタスケテ

【参考】

Reloading Factory Girl Factories in the Rails 3 Console | Transcending Frontiers はてなブックマーク - Reloading Factory Girl Factories in the Rails 3 Console | Transcending Frontiers

devise – “Could not find a valid mapping for #” only on second and successive tests – Stack Overflow はてなブックマーク - devise - ” only on second and successive tests – Stack Overflow” border=”0″ />

[Rails][FactoryGirl] エラー:Factory already registered: xxx

Ruby on Railsにて、

Factory already registered: xxx

lib/tasks/

require 'factory_girl'
Dir[Rails.root.join('spec/factories/*.rb')].each {|f| require f }

【参考】ruby on rails – Factory already registered: user (FactoryGirl::DuplicateDefinitionError) – Stack Overflow はてなブックマーク - ruby on rails - Factory already registered: user (FactoryGirl::DuplicateDefinitionError) - Stack Overflow

[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 = "[email protected]"
  s.name  = "Jon"
end
 
User.seed do |s|
  s.id    = 2
  s.login = "emily"
  s.email = "[email protected]"
  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?

以上です。

[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