• [Piece of RoR]DRYなコードを書くために・・・

    このエントリーを含むはてなブックマークはてなブックマーク - [Piece of RoR]DRYなコードを書くために・・・ この記事をクリップ!Livedoorクリップ - [Piece of RoR]DRYなコードを書くために・・・ Yahoo!ブックマークに登録 @niftyクリップに追加 Share on Tumblr FC2ブックマークへ追加 newsing it! Googleブックマークに追加 Bookmark this on Delicious FriendFeedで共有 このエントリをつぶやくこのWebページのtweets

    こんにちは!システム部の徳田です。

    前回はDRYなコードを書くために、sendメソッドの紹介を・・・といったのですが、ちょっとその前にもっと基本的なメソッドの紹介をさせていただきます。

    inject

    これは、rubyの基本的なメソッドです。

    1~5の合計を求めるコードを書くとしたら、

    eachを用いることにより下記のように書けます。

    result = 0
    (1..5).each {|v| result += v }
    p result

    これでも十分DRYだと思っていたのですが、injectメソッドを用いることによりさらにDRYに書けます。

    p (1..5).inject(0) {|result, item| result + item }

    3行が1行になりましたね。すごく便利なメソッドです。

    ちなみに、~.inject(0)の0は、result = 0と同じことを示しています。

    0で初期化をするという意味です。

    また上記のinjectメソッドはRubyのメソッドですが、Railsのsumメソッドを使用することもできます。

    p (1..5).sum

    すごいすっきりしますね~。用途によっては使い得ない場合もありますが、知っておいて損はないメソッドですね。

    ここで、RubyとRailsでそれぞれメソッドを紹介させていただきましたが、先日上司にごっちゃにならないように!とアドバイスを頂きました。

    便利なメソッドはどんどん覚えていったほうがいいのですが、使い方と同時にRailsのメソッドなのか、Rubyのメソッドなのか。。きちんと理解して使用することが大切のようです。

     
  • [Piece of RoR]はじめまして!

    このエントリーを含むはてなブックマークはてなブックマーク - [Piece of RoR]はじめまして! この記事をクリップ!Livedoorクリップ - [Piece of RoR]はじめまして! Yahoo!ブックマークに登録 @niftyクリップに追加 Share on Tumblr FC2ブックマークへ追加 newsing it! Googleブックマークに追加 Bookmark this on Delicious FriendFeedで共有 このエントリをつぶやくこのWebページのtweets
    はじめまして、こんにちは。
    入社2年目のシステム部の徳田と申しますm(_ _  )m今、Ruby on RailsのプロジェクトにTEとして携わらせてもらっています。私自身もRoRを日々勉強中です。自分が学んだ、RubyやRailsのことをつらつら書かせていただきます。Ruby on Railsの欠片を少しずつ紹介していくという意味で、タイトルをPiece Of RoRっていう名前にします・・・!内容的には入門レベルになってしまいますが、よりレベルの高い記事を書いていけるよう、これから頑張ります。
    今日は、Railsの原則の一つであるDRYについて書きます。知っている方も多いと思いますが、DRYとは・・・
    Don’t Repeat Yourself、つまり「重複を排除する」「同じ作業を繰り返さない」という意味です。
    私もよくあるのですが・・・同じような処理を繰り返さなくてはいけないとき、プログラミングを覚えたばかりのエンジニアは、ひたすらガシガシとコードを書きがちです^^;しかし、共通化・部品化できるような部分はできるだけそうしないと、後からソースを改修したりするときにバグを生んでしまう可能性を高めてしまいます。
    いざコードを改修するときに・・・直すところが少ない方が楽ですし、テストも簡単ですみますよね。
    そんなコードをDRYにするために、次回の記事では、私が最近覚えたRubyのsendメソッドについてご紹介しますm(_ _ )m
     
  • UGUISU携帯対応について

    このエントリーを含むはてなブックマークはてなブックマーク - UGUISU携帯対応について この記事をクリップ!Livedoorクリップ - UGUISU携帯対応について Yahoo!ブックマークに登録 @niftyクリップに追加 Share on Tumblr FC2ブックマークへ追加 newsing it! Googleブックマークに追加 Bookmark this on Delicious FriendFeedで共有 このエントリをつぶやくこのWebページのtweets

    UGUISU ver.1.2でiPhone、Android、3キャリア携帯に対応させました。

    UGUISUの携帯対応はとても簡単でした。なぜならRailsではjpmobileという素晴らしいライブラリがあるからです。

    UGUISUではjpmobile-0.0.8を利用させて頂きました。

    jpmobile-0.0.8はスマートフォンの対応がされていなかったので、こちらを参考にスマートフォンの対応をしました。

    また、ビューの切り替えは行えますが、エラー画面の切り替えがなかったのでなかったのでパッチを作成しました。jpmobileのビューの切り替えと同じような感覚で500.htmlなどのエラー画面をモバイル版と携帯版で切り替えるられるようになります。

    文字コード変換などはjpmobileが行ってくれますので、後はそれぞれの端末ごとにビューを作成し、iPhoneのホーム画面用のアイコンを追加しただけです。

    Rails+jpmobileだと簡単にモバイルサイトを構築できます。

    皆さんもRails+jpmobileでモバイルサイトを構築してはいかがでしょうか。

    y-ozawa

    製品戦略室チーフプログラマ UGUISU(http://www.uguisu.biz)開発責任者

     
  • マイグレーションによるデータ移行について

    このエントリーを含むはてなブックマークはてなブックマーク - マイグレーションによるデータ移行について この記事をクリップ!Livedoorクリップ - マイグレーションによるデータ移行について Yahoo!ブックマークに登録 @niftyクリップに追加 Share on Tumblr FC2ブックマークへ追加 newsing it! Googleブックマークに追加 Bookmark this on Delicious FriendFeedで共有 このエントリをつぶやくこのWebページのtweets

    今回は、Ruby on Railsのマイグレーションによるデータ移行についてお話します。

    新しく入ったプロジェクトでマイグレーションを実行したら、エラーが起きてテーブルが作成できないことがありました。マイグレーションファイルを見たら、以下のようなコードが書かれており、マイグレーションによるデータ移行部分でエラーになっていました。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    
    class AddColumnToModels < ActiveRecord::Migration
      def self.up
        add_column :models, :column, :string
        Model.named_scope.each do |model|
          # モデルに関する様々な更新処理。実際はもっと複雑でした。
          model.update_attributes!(:column => "example")
        end
      end
    end

    エラーの原因は、マイグレーション内で利用しているモデルが存在しない、またはモデル内部のロジックがマイグレーション作成時と異なり例外が発生していることが原因でした。

    マイグレーションによるデータ移行はよく行われます。
    しかし、マイグレーションの中でモデルを利用してデータ移行をするのは避けるべきだと思います。
    なぜなら、マイグレーション作成時のモデルと最新のモデルではロジックなどに差異がある可能性があり、それによってマイグレーションが動かなくなる可能性があるからです。また、モデルを修正するたびにマイグレーションファイルも修正するのも、保守性がよろしくありません。

    そこで、私はデータ移行を行う場合、基本はモデルを使わずに直接SQLを書くようにしています。

    1
    2
    3
    4
    5
    6
    
    class AddColumnToModels < ActiveRecord::Migration
      def self.up
        add_column :models, :column, :string
        execute "UPDATE models SET column = 'example'"
      end
    end

    こうすることでモデルとマイグレーションを切り離すことができます。また、モデルによるコールバックなどの無駄な処理がなくなることにより高速にデータ移行ができます。

    とはいっても、モデルを利用した方が効率が良いときがあります。その場合は、マイグレーション専用のモデルを定義することで、通常のモデルと切り離して利用します。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    
    class AddColumnToModels < ActiveRecord::Migration
     
      class TempModel < ActiveRecord::Base
        set_table_name "models"
        # データ移行に必要な処理だけを記載
      end
     
      def self.up
        add_column :models, :column, :string
        TempModel.named_scope.each do |model|
          model.update_attributes!(:column => "value")
        end
      end
    end

    私は上の2つを利用して、マイグレーション内のデータ移行を行っています。
    モデルを使うデータ移行より手間はかかりますが、モデルやライブラリを修正した場合にマイグレーションを見直し修正する必要がなくなり、トータルでは手間が少なくなると思います。是非試してみてください。

    y-ozawa

    製品戦略室チーフプログラマ UGUISU(http://www.uguisu.biz)開発責任者

     
  • UGUISUで利用しているjQueryプラグインを紹介

    このエントリーを含むはてなブックマークはてなブックマーク - UGUISUで利用しているjQueryプラグインを紹介 この記事をクリップ!Livedoorクリップ - UGUISUで利用しているjQueryプラグインを紹介 Yahoo!ブックマークに登録 @niftyクリップに追加 Share on Tumblr FC2ブックマークへ追加 newsing it! Googleブックマークに追加 Bookmark this on Delicious FriendFeedで共有 このエントリをつぶやくこのWebページのtweets

    前回はUGUISUで利用しているRuby on Railsのプラグインを紹介しましたが、今回はUGUISUで利用しているjQueryのプラグインをご紹介します。

    jqPlot

    折れ線、円グラフなど多彩な表現ができるjQueryプラグインです。

    FuncyBox

    シンプルなアニメーションで画像を拡大表示するLightbox風なjQueryプラグインです。

    Read the rest of this entry »

    y-ozawa

    製品戦略室チーフプログラマ UGUISU(http://www.uguisu.biz)開発責任者

     
  • UGUISUで利用しているプラグイン紹介

    このエントリーを含むはてなブックマークはてなブックマーク - UGUISUで利用しているプラグイン紹介 この記事をクリップ!Livedoorクリップ - UGUISUで利用しているプラグイン紹介 Yahoo!ブックマークに登録 @niftyクリップに追加 Share on Tumblr FC2ブックマークへ追加 newsing it! Googleブックマークに追加 Bookmark this on Delicious FriendFeedで共有 このエントリをつぶやくこのWebページのtweets

    r-learningで技術系のブログを始めました。
    RubyやRuby on Rails、Android、iPhone系の話題を中心に、弊社で開発しているサービスや研究中の技術を話していきます。

    さて一番最初は、r-learningで初のサービスであるUGUISUについてお話します。
    UGUISUはRubyのフレームワークであるRuby on RailsとJavascriptフレームワークjQueryを利用して実装をしました。
    どちらもプラグインが充実しており、開発を手早くできるのが魅力です。

    今回はUGUISUで利用したRailsのプラグインやGemを紹介します。
    UGUISUでは様々なプラグインを利用、一部変更して利用させて頂きました。
    作成者の皆様、ありがとうございました。

    • acts_as_list - ActiveRecordにリスト構造管理機能を追加します。
    • acts_as_paranoid – ActiveRecordに論理削除機能を追加します。
    • acts_as_tree – ActiveRecordにツリー構造管理機能を追加します。
    • attachment_fu – ファイルアップロード機能を追加します。
    • i18n_generators – メッセージを日本語化させるのに利用しています。
    • restful-authentication – ログイン認証を簡単に実装できるようになります。
    • will_paginateページネーションを簡単に実装できるようになります。
    • simple_captcha – 画像認証機能を追加します。
    • crummy – パンくず表示で利用しています。
    • hoptoad_notifierエラー通知+エラー管理Webサービスのhoptoadのプラグインです。デモサイトで利用しています。
    • record_with_operator - ActiveRecordのタイムスタンプと似た感じでモデルに作成者や更新者のユーザーIDを簡単にできるようになります。
    • aasm - ActiveRecordで簡単にステートマシンを実装できます。
    • simple-rss – RSSフィードを簡単に取得できます。

    この中で今イチ押しなのは、hoptoad_notifierrecord_with_operatorですね。
    hoptoad_notifierはフリーからも利用でき、プランを変更すればSSLにも対応してくれます。
    record_with_operatorは、関連にも自動でユーザーIDを設定してくれたり、acts_as_paranoidにも対応しており削除者のユーザーIDまでも入れてくれて大変便利です。
    どちらも簡単に試せるので、是非試してみてください。

    次回は、jQueryとRailsについて書こうと思います。

    y-ozawa

    製品戦略室チーフプログラマ UGUISU(http://www.uguisu.biz)開発責任者