- 更新日: 2014年5月6日
- Rails
Rails で1日1回ランダムな値で情報を更新するコード
※ このエントリーの内容は、結局上手くいかなかったので採用しませんでした。なので、参考にしないようにお願いします。最終的には、1日1回更新する情報を、DBに保存するように変更しました。
Railsアプリケーションで、ことわざや格言などがたくさん保存されているDBテーブル(proverbsテーブル)から、1日1回「今日の言葉」としてランダムに取得するコードを書きました。毎回ランダムだったら sample メソッド使ってすぐ終わりなんだけど、1日1回なので新しい日付になって最初のリクエストの時だけ「今日の言葉」の情報を更新させる。
— 環境 —
rails-4.0.1
devise-3.2.2
omniauth-1.1.4
クラス変数に「今日の言葉」と「保存済み日付」の情報を持たせる
トップページに表示させるためなので、HomeController の index アクションに追加。
app/controllers/home_controller.rb
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
class HomeController < ApplicationController @@date_info = nil @@todays_word = nil def index # detect user's timezone if user_signed_in? timezone = current_user.time_zone else timezone = User.get_user_timezone(cookies["timezone"]) end @todays_date = DateTime.now.in_time_zone(timezone).to_formatted_s(:extra_short) # get today's words unless @@date_info == @todays_date @@todays_word = Proverbs.select(:word, :meaning).all.sample @@date_info = @todays_date end @todays_word = @@todays_word #... end #... end |
@@date_info クラス変数に保存済みの日付情報、@@todays_word に今日の言葉の情報を持たせます。最初にユーザーのタイムゾーンを判定。to_formatted_s(:extra_short) は、年月日だけを取得するフォーマット用のメソッドです。
その後、保存済みの日付情報と今日の日付が異なっていた場合、つまり今日の日付が新しく変わった場合にのみ、@@todays_word を更新。保存済みの日付も新しい日付に更新する。
あとは、@todays_word インスタンス変数の情報(@todays_word.word, @todays_word.meaning)をビューで表示させればOKです。
使ってあるメソッドの詳細
“timezone”クッキーから訪問者のタイムゾーンを判定する get_user_timezone メソッドについては → Rails でユーザーのサインアップ時にタイムゾーンを自動で判定して保存 | EasyRamble
年月日だけを表示させるように日付をフォーマットする to_formatted_s(:extra_short) については → Rails で時間・時刻表示の独自フォーマットを作成する | EasyRamble
以上で、1日1回だけランダムに情報を更新させることができました。
- Rails の関連記事
- RailsでMySQLパーティショニングのマイグレーション
- Rails ActiveRecordでdatetime型カラムのGROUP BY集計にタイムゾーンを考慮する
- RailsプラグインGemの作成方法、RSpecテストまで含めたrails pluginの作り方
- RailsでAMPに対応するgemをリリースしました
- Railsでrequest.urlとrequest.original_urlの違い
- Railsでwheneverによるcronバッチ処理
- Google AnalyticsのRails Turbolinks対応
- Railsアプリにソーシャル・シェアボタンを簡単設置
- Rails監視ツール用にErrbitをHerokuで運用
- Facebook APIバージョンのアップグレード手順(Rails OmniAuth)
Leave Your Message!