カテゴリー : 2013年 2月

[Ruby on Rails] Action Mailer でのメール送信処理

Ruby on Rails の Action Mailer でのメール送信処理をする方法をメモ。

主にこのへんを読む。

Action Mailer Basics — Ruby on Rails Guides

Rails 3 の Action Mailerまとめ – おもしろWEBサービス開発日記

ActionMailer Railsアプリからメールを送信 – 酒と泪とRubyとRailsと

Action Mailer

Gmail で送信する設定方法

config/environments/production.rb に下記のような感じで設定する。

MyApp::Application.configure do
  # Mailer
  config.action_mailer.raise_delivery_errors = true
  config.action_mailer.delivery_method = :smtp
 
  config.action_mailer.smtp_settings = {
    address: "smtp.gmail.com",
    port: 587,
    domain: 'example.com',
    user_name: "gmail_user",
    password: "gmail_pass",
    authentication: 'plain',
    enable_starttls_auto: true,
  }
end

[参考]

Rails 3.0 でメールの送信に Gmail を使う – LazyLoadLife

railsでgmailをメールクライアントとして設定する | simpleplay's Log

[Ruby on Rails] ActionMailer views で helper メソッドを使う方法

Ruby on Rails の ActionMailer views で helper メソッドを使う方法をメモ。

例えば、app/views/contact_mailer/inquiry.text.haml で ApplicationHelper に定義したメソッドを使いたい場合は、下記のように add_template_helper メソッドを使います。

class ContactMailer < ActionMailer::Base
  add_template_helper(ApplicationHelper)
 
  def inquiry(contact)
  end
end

[参考]:ruby on rails – How to use my view helpers in my ActionMailer views? – Stack Overflow

[Mongoose] Schema.Types.Mixed だと save 前に .markModified が必要

Node.js + Mongoose でインスタンスを save で保存できないときの原因のひとつに Schema.Types.Mixed があります。

プロパティの型が Schema.Types.Mixed とかだと、値に変更があったことを Mongoose が自動検知してくれないみたいです。

To “tell” Mongoose that the value of a Mixed type has changed, call
the .markModified(path) method of the document passing the path to the
Mixed type you just changed.

[引用元]:Mongoose SchemaTypes v3.5.6

markModified メソッドの使い方は下記のような感じです。

var schema = new Schema({
  mixed:   Schema.Types.Mixed
})
 
// example use
 
var Thing = mongoose.model('Thing', schema);
 
var m = new Thing;
m.mixed = {[ any: { thing: 'i want' } ]};
m.markModified('mixed');
m.save(callback);

[Chrome] 殺伐としたGithubに絵文字を追加するための拡張機能「Emoty」

殺伐としたGithubに絵文字を追加するための Chrome拡張機能「Emoty」がステキです。

Chrome ウェブストア – Emoty

絵文字のベースは「Emoji cheat sheet for Campfire and GitHub」みたいです。

[Ruby on Rails] RSpec でのファイルアップロードの方法

Ruby on Rails + RSpec でのファイルアップロードするためのメソッドをメモ。

fixture_file_upload
Rack::Test::UploadedFile.new
ActionController::TestUploadedFile.new
ActionDispatch::Http::UploadedFile.new

[参考]:ruby – How do I test a file upload in rails? – Stack Overflow はてなブックマーク - ruby - How do I test a file upload in rails? - Stack Overflow

[Ruby] will_paginate を nested resources で使う方法

ページネーション機能を提供する gem「will_paginate」を nested resources で使う方法をメモ。

下記のように params に hash でルーティングを指定してあげればOKです。

will_paginate @tasks,
  params: { controller: 'tasks', action: 'index', project_id: @project.id }

[Ruby] Ransack の sort_link を nested resources で使う方法

Ransack の sort_link を nested resources で使う方法をメモ。

下記のように、hash で controller, action, project_id などを指定します。

sort_link @search, :name, 'タスク名',
  { controller: 'tasks', action: 'index', project_id: @project.id }

[参考]

ruby on rails – Ransack with sort_link for nested resources – Stack Overflow はてなブックマーク - ruby on rails - Ransack with sort_link for nested resources - Stack Overflow

ransack/lib/ransack/helpers/form_helper.rb at v0.6.0 · ernie/ransack · GitHub はてなブックマーク - ransack/lib/ransack/helpers/form_helper.rb at v0.6.0 · ernie/ransack · GitHub

[RSpec] stub_const で定数の stub(スタブ)化

RSpec で、定数を stub(スタブ)化するには stub_const メソッドを使います。

(例)定数 FOO をスタブ化

FOO = 7
 
describe "stubbing FOO" do
  it "can stub FOO with a different value" do
    stub_const("FOO", 5)
    FOO.should eq(5)
  end
 
  it "restores the stubbed constant when the example completes" do
    FOO.should eq(7)
  end
end

(例)Class や Module の定数をスタブ化

module MyGem
  class SomeClass
    FOO = 7
  end
end
 
module MyGem
  describe SomeClass do
    it "stubs the nested constant when it is fully qualified" do
      stub_const("MyGem::SomeClass::FOO", 5)
      SomeClass::FOO.should eq(5)
    end
  end
end

[参考]:Stub Defined Constant – Stubbing constants – RSpec Mocks – RSpec – Relish はてなブックマーク - Stub Defined Constant - Stubbing constants - RSpec Mocks - RSpec - Relish

[Ruby on Rails] Boolean型の presence validation

Ruby on Rails で、Boolean型の presence validation は false が invalid になってしまう。

なので、

validates :possible, presence: true

presence を指定するのではなく、

validates :possible, inclusion: {in: [true, false]}

というように inclusion で true, false の2値のみに限定してあげれば良い。

[参考]:validation – Rails: how do I validate that something is a boolean? – Stack Overflow はてなブックマーク - validation - Rails: how do I validate that something is a boolean? - Stack Overflow

[Ruby on Rails] 日付・時刻のバリデーションなら「ValidatesTimeliness」

Ruby on Rails で、日付・時刻のバリデーションをするなら ValidatesTimeliness という gem がおすすめです。

ActiveRecord だけでなく Mongoid でも使えるみたい。

adzap/validates_timeliness · GitHub はてなブックマーク - adzap/validates_timeliness · GitHub

validates_timeliness gem をインストール後、日本語のエラーメッセージを最低限、設定します。

# config/locales/model.ja.yml
ja:
  activerecord:
    errors:
      messages:
        invalid_date: は正しい形式で入力してください。
        invalid_time: は正しい形式で入力してください。
        invalid_datetime: は正しい形式で入力してください。

基本的な設定はこれだけで、あとはモデルに validates_datetime とかでバリデーションを設定できます。

# app/models/article.rb
class Article < ActiveRecord::Base
  validates_datetime :published_at
  validates_date :published_date
  validates_time :published_time
end

日付や時刻のバリデーションフォーマットがデフォルトのものだけでは、足りない場合は、独自定義したフォーマットを追加することもできます。

Plugin Parser を config.use_plugin_parser = true でONにして、config.parser.add_formats で追加するだけです。

# config/initializers/validates_timeliness.rb
ValidatesTimeliness.setup do |config|
 
  config.use_plugin_parser = true
  config.parser.add_formats(:time, "%H:%M")
 
end

上記は、Time に「01:23」みたいなフォーマットも許可する設定です。

もっと詳しい情報はWikiを見てください。

Plugin Parser · adzap/validates_timeliness Wiki はてなブックマーク - Plugin Parser · adzap/validates_timeliness Wiki

ValidatesTimeliness は、Date/time parser に timeliness を使ってるので、デフォルトのフォーマットは timeliness のページから確認できます。

timeliness/README.rdoc at master · adzap/timeliness · GitHub はてなブックマーク - timeliness/README.rdoc at master · adzap/timeliness · GitHub

ValidatesTimeliness 便利ですね。

日付や時刻のフォーマットって普遍だと思うので、Railsにデフォルトで搭載されていても良さそうなのに何でないんでしょうね?