Railsでjsonやxmlを配信する

Railsではjsonxmlを配信する時は、それに応じたビューを作成するだけで良い。例えばjsonを配信する時はhoge.json.erbを作成しリクエスト時にexample.com/hoge.jsonとするだけで良い。このようにするだけでheader情報も自動的に設定されるため、こちらでいちいち設定する必要もない。

Rubyで相対的な文字列による時間を扱うChronicの利用について

Rubyで相対的な時間を扱う場合、様々な方法が用意されているが、3 years agoといった文字列を処理する場合はChronicというgemを利用すると良い。

Rubyで利用する場合Chronicをインストールする

gem chronic

Railsで利用する場合はGemfileに下記を追加しbundle installで良い

gem 'chronic'

Railsで下記のように実行すれば10年前の時間が得られる

date = Chronic.parse("10 years ago")
logger.debug(date)
# 2004-08-29 21:39:27 +0900

使用できる表現はGithubを参照されたし
mojombo/chronic · GitHub

Railsでgemのmeta-tagsを使う

Gemfileに下記を追加しbundle installを行う

gem 'meta-tags'

レイアウトのhead内などに下記を追加する。set_meta_tagsは直接head内に記述しても何も出力されないし<%= set_meta_tags hoge: hoge %>としても内部のハッシュが出力されるだけでHTMLは出力されない。

<head>
  <%= display_meta_tags :site => 'My website' %>
</head>

特定のビューファイルで下記のように設定すれば、先ほど設定したhead内にcanonicalタグが出力される。

<% set_meta_tags canonical: "http://example.com" %>

またはコントローラー内のアクションに下記のように記述しても良い

set_meta_tags canonical: "http://example.com"

直接レイアウトに変更を加えたり、ヘルパーを利用することなく、適宜必要に応じて必要な時だけhead内にメタタグを追加することができる。

また全ページ共通でメタタグを出力したい場合はdisplay_meta_tagsのオプションで指定することもできる。詳しいオプションはGitHubから確認できる。
kpumuk/meta-tags · GitHub

Rubyで配列の件数を数える

object.lengthを使えば良い

hoge = [10, 20, "a", "b"]
puts hoge.length
# 4

ハッシュでも同様である

hoge = {key1: 10, key2: 20, key3: "a"}
puts hoge.length
# 3

これらのコードはruby -eに貼り付けて実行できる。自分で実際に配列やハッシュを書き換えて出力結果の変化を確認してみよう。

別言語・別フレームワークで管理していたユーザーのパスワードハッシュをRailsへ移行するケースの対応策案

既存のプロジェクトをRailsに移行する場合、通常のデータはRails用に再変換を行ったり、プログラムについては書き直せば済むが、ユーザーの入力したパスワードのハッシュは復号化できず、Railsの認証用ハッシュに書き換えることができない。

この記事では、Railsへユーザー認証を移行する仕組み案をまとめる。

対策案1 : 新旧ハッシュを共存させユーザーに意識させない

Rails移行後にユーザー登録を行ったユーザーに対しては、Railsのハッシュで認証を行い、それ以前に登録を行ったユーザーは古いハッシュで認証を行う方法。ユーザーの登録日時から新旧を割り出し、認証方式を切り替えて対応する。

古いハッシュで登録を行ったユーザーはログイン後にRailsのハッシュを生成し上書きを行えば、ユーザーに意識させることなくRailsの認証方式を利用できるようになる。

対策案2 : 旧システムにユーザー移行機能を設ける

旧システムの認証機能だけを別のページに残し、旧アカウントを持つユーザーにはそこからログインしてもらい、Rails用のアカウントへ移行する手続きを行ってもらう。

対策案1に比べて、Railsへの以降機能の記述を最小限に抑えることができる他、Railsのユーザー認証用gemなども意識することなく利用できる。ユーザーに与えるストレスも最小限で済む。

対策案3 : Railsの認証機能を利用しない

旧システムの認証機能をRails上で再現し、Railsで生成されるハッシュなどを利用せずに対応する。この場合Railsの認証機能の一部が利用できなくなる。

対策案4 : パスワード再設定機能を利用する

古いパスワードは全て破棄し、新しいパスワードを再発行してもらう。パスワード再設定用メールアドレスだけでは、古いメールアドレスを設定しているユーザーがいる可能性があるため、再設定用メールアドレスだけではなく、ユーザーの本人確認が別の手段でも行えるようなサービスでのみ有効。

RubyのTime.nowなどでUTCの時間を取得する

RubyではTime.nowで現在のタイムゾーンに基づいた時間を取得することができる。例えばTokyoを設定していれば日本時間が取得される。

特定の環境下において、UTCで時間を取得したい場合にはTime.now.utcを使用する。

puts Time.now.utc.to_s # 2014-08-27 06:13:50 UTC
puts Time.now.to_s # 2014-08-27 15:13:50 +0900

一般的な利用シーンでは使う機会はないと思われるが、多言語対応のためにデータベースにUTCで時間を保存しているケースにおいて、データの引き出しなどには日本時間は使用できないため、Time.now.utcを使う事がある。