昔の Ruby On Rails のブログ

注意! RoR2 とかの話です。今は更新していません。昔、はてなダイアリーで書いていたブログを移行しました。

Windows/Office武勇伝Surface Proが当たる! 開発者グループOPENキャンペーン>

電話サポートでこんな相談受けました。

相談者: 『ウィンドウを最大化すると画面に現れるけど、「元のサイズに戻す」と画面から消えてしまいます。』

私: 「Alt + Space ⇒ M ⇒ 右矢印キーや下矢印キーを何度か押してください。バーが見えたらウィンドウ隅をつまんでドラッグしてください」

で解決しました。

Rails のソースを grep するツール

rails プロジェクト配下のソースファイルを grep するコマンドです。

5ヶ月ほど前の拾い物、 https://gist.github.com/189815/ が微妙に使いづらいので書き直してみた。
(まだまだ不備とかあると思うので、がしがし鍛えてやってください)

ソースはここ

https://gist.github.com/1403631

$HOME/bin/ とかに入れて使えばよいかと。

grep コマンドのオプションがそのまま使えます。

Timezone の扱い

http://railscasts.com/episodes/103-site-wide-announcements に以下のようなロジックがあります。

def self.current_announcements(hide_time)
  with_scope :find => { :conditions => "starts_at <= now() AND ends_at >= now()" } do
    if hide_time.nil?
      find(:all)
    else
      find(:all, :conditions => ["updated_at > ? OR starts_at > ?", hide_time, hide_time])
    end
  end
end

このロジックの日時の部分でハマりました。
Timezoneの扱いです。

私の理解では

  • config.time_zone = 'Tokyo' としてもしなくてもDBには UTC で記録される
  • config.time_zone = 'Tokyo' とすると、Rails 経由だとよきに計らってくれる
  • "starts_at <= now() ..." と ["starts_at <= ? ...", Time.now] はどっちも、期待する結果になりません

今のところ…

["starts_at <= ? ...", Time.now - 9.hour]

というダサいコードになっています orz
上記だと hide_time も時間差注意ですね。


ちなみに now() は MySQL ではOKだけど、SQLite3 ではNGでした。
あと、デバッグは console で

ActiveRecord::Base.logger = Logger.new(STDOUT) 

するとSQL文が展開表示されるので Goodです。

申込み内容を一旦保存して、カード決済のサイトへ

備忘録です。他の人がこのパターンに合致するかは分かりません。
あと、Paypal じゃないよ。

「確認画面 ⇒ カード情報入力な別サイト ⇒ ThankYou画面」の流れがわかった。
別サイト遷移直前に

1) モデル保存。その際、session に id 保存
2) 別サイトフォームを表示。ただし、Javascript で自動POST
3) ThankYou画面に戻ってきたら保存した session を load

def create
  ...
  if @order.save
    redirect_to :action => :my_delegate, :id => @order.id
  else
  ...
end

def my_delegate
  @order = Order.find(params[:id])
  session[:order_id] = @order.id
end

def done
  @order = Order.find(session[:id])
end

view

<form name="hoge" method="post" action="http://othersite.example.jp/...">
  ...
  <%= submit_tag '画面が自動的に切り替わらない場合はクリック' %>
</form>

<% javascript_tag do %>
  document.hoge.submit();
<% end %>

入力内容を保存するタイミングでずっと悩んでいました。
本来は create アクションで保存後に別サイトに POST する事ができれば良いのですが、
一発ではできないようなので、このような案となりました。

button_to に disable_with オプションは無い

以下の様に使いたくなりましたが、disable_with オプションはありませんでした。

<%= button_to('調べる!(5分ぐらい掛ります)', check_hoges_path, :disable_with => '調査中...') %>

以下で対応しました。

<% form_tag check_hoges_path do %>
  <%= submit_tag('調べる!(5分ぐらい掛ります)', :disable_with => '調査中...') %>
<% end %>