2012年11月22日木曜日

jQueryのdatepickerで特定の曜日のみ押下可能

ある曜日だけを活性にして、他を押せないようにする場合、jQuery の datepicker の
beforeShowDay オプションでハンドリングできます。


下記では、日曜日のみ押せるようにしています。(日曜日=0)
<script>
  $(function() {
    $('#start').datepicker({
        beforeShowDay: function(dt) {
         return [dt.getDay() == 0 ? true : false];
        }
    });
  });
</script>

<参考>
http://jquerybyexample.blogspot.com/2010/07/disable-specific-days-in-jquery.html

2012年11月8日木曜日

cronで実行するとエラーになる

手動で実行すればエラーにならないのに、cronから実行するとエラーになる。
過去に2-3度同じことがあったので、メモっておきます。

前提
・環境はUbuntu10.04
・/etc/crontab にcron定義

問題1
<現象>
・日本語のメール送信が化ける
・日本語を含むファイルやフォルダにて、日本語が文字化けして読み込めない

<対処法>
下記をcrontabに追加 。
    LANG=ja_JP.UTF-8
エラーログが/etc/crontab で実行した際に表示されていなかったが、
crontab -e では、表示されたので気づいた。

問題2
<現象>
・broken pipeエラーが発生
 Javaでは、こんなエラーだったり…
   Caused by: java.net.SocketException: Broken pipe
 Rubyでは、こんなエラーだったり…
   #<Errno::EPIPE: Broken pipe>

<対処法>
/dev/nullに出力を捨てる!
"command > /dev/null 2>&1"



Rubyで最後の文字取得

最後の文字取得には、いろいろ方法があるとは思いますが、
忘れない内にこんな方法もあるってことを書いておきます。

> str = "ABCDE"
 => "ABCDE"

# 最終文字
> str[-1, 1]
 => "E"

# 最後から3番目の、そこから2文字
> str[-3, 2]
 => "CD"

2012年11月1日木曜日

ActionMailerの使い方

Rails3でActionMailerを用いたメール送信について。
ファイルは多い感じですが、いたって簡単。

◆雛形の生成
$ rails g mailer WeeklyMailer
      create  app/mailers/weekly_mailer.rb
      invoke  erb
      create    app/views/weekly_mailer
      invoke  rspec
      create    spec/mailers/weekly_mailer_spec.rb

◆差出人、送信先、本文の送り方
# app/mailers/weekly_mailer.rb
class WeeklyMailer < ActionMailer::Base
  default from: "abc@example.com"

  def weekly_email

    @date = Period.date_from

    recipient = "xxx@example.com"
    subject = "お知らせ @date"
    mail(:to => recipient,
         :subject => subject)do |format|
      format.html # HTML形式
      format.text # テキスト形式
    end
  end
end

◆ テンプレートの書き方
こちらでは、HTML形式のビューの書き方を紹介。
bodyタグ内を書けば良し。
text形式の場合は、ファイル名を weekly_email.text.erb にして不要なタグをなくせばOK。
# app/views/weekly_mailer/weekly_email.html.erb

<!DOCTYPE html>
<html>
  <head>
    <meta content='text/html; charset=UTF-8' http-equiv='Content-Type' />
  </head>
  <body>
    <p>てすと</p>
  </body>
</html>

◆コントローラから呼び出し
週次にcronから呼びたいので、こちらに。
ボタン押下してメール送信したいほうが多いかな?
class WeeklyMailController < ApplicationController
  class << self
    def exec
      WeeklyMailer.weekly_email.deliver
    end
  end
end

◆実行
rails r WeeklyMailController.exec

◆デバッグ
こちらより→ http://blog.twiwt.org/e/a986c5

# config/initializers/action_mailer_log_subscriber.rb
require 'action_mailer/log_subscriber'

module ActionMailer
  class LogSubscriber
    def deliver_with_debug(event)
      deliver_without_debug(event)
      debug(Mail.new(event.payload[:mail]).subject)
      debug(Mail.new(event.payload[:mail]).body)
    end
    alias_method_chain :deliver, :debug
  end
end


◆ Configファイル (開発環境)
ここまでやって、エラーもないし、送られてるはずなんだけど、届いてない!
そんな時は、定義ファイルの設定を確認しましょう。

config/environments/development.rb

  config.action_mailer.raise_delivery_errors = true  #デフォルトはfalse
  config.action_mailer.delivery_method = :smtp
  config.action_mailer.smtp_settings = {
      :enable_starttls_auto => false,    ## ないとエラー(※)がでる
      :address        => 'xxxxx.example.com',
      :port           => 250,
    }

※エラー内容
bundle/ruby/1.9.1/gems/railties-3.2.6/lib/rails/commands/runner.rb:53:in `eval': hostname does not match the server certificate (OpenSSL::SSL::SSLError)
        from /home/xxx/.rvm/rubies/ruby-1.9.3-p194/lib/ruby/1.9.1/net/smtp.rb:585:in `tlsconnect'
        from /home/xxx/.rvm/rubies/ruby-1.9.3-p194/lib/ruby/1.9.1/net/smtp.rb:560:in `do_start'
        from /home/xxx/.rvm/rubies/ruby-1.9.3-p194/lib/ruby/1.9.1/net/smtp.rb:519:in `start'
...

TLS接続を使用としてエラーになっているみたいなので、TLS接続をしないようにすれば良いらしい。

◆ メールの差出人に日本語名を出したい場合
gemがないと文字化けしますので、bundleに追加。
gem 'mail-iso-2022-jp'
差出人を書く所は、こんな書き方になります。
default from: "なまえ<aaa@example.com>", :charset => 'iso-2022-jp'

◆参考
http://edgeguides.rubyonrails.org/action_mailer_basics.html