Archive for the ‘ruby’ Category

    はてなブックマーク - rails3.2でdeviseのインストール手順を間違えたら面倒だった話
    このエントリーをはてなブックマークに追加

    この前Rails3.1がリリースされたと思ったら、もうRails3.2です。
    バージョンが上がると、重宝して使っていたgemやプラグインが対応に追いつくのかが不安なんですが、その内のひとつ「devise」に関してのちょっとしたエントリーです。

    deviseとは

    github.com/plataformatec/devise

    deviseはシステムのログイン管理を担ってくれるRubyのパッケージです。
    ログイン認証が必要なシステムに対して、ユーザー登録・パスワードの暗号化・パスワードリセットなどの処理を担ってくれるので便利です。

    そのdeviseを使用したプロジェクトを作ります。
    Railsは3.2です。

    rails new sample

    で、プロジェクト作成。データベースも作成しておきます。

    Gemfileに、deviseに関する行を追加。

    gem 'devise'

    その後、本来は

    rails generate devise:install

    とすべきところを、

    rails generate devise user

    と、いきなりモデルの作成をしました。
    すると、

    /home/user/.rvm/gems/ruby-1.9.2-p180@rails32/gems/execjs-1.3.0/lib/execjs/runtimes.rb:50:in `autodetect': Could not find a JavaScript runtime. See https://github.com/sstephenson/execjs for a list of available runtimes. (ExecJS::RuntimeUnavailable)

    本編とは関係ないエラーが出てしまいました。
    JavaScriptのランタイムが無いと。
    Gemfileから

    # gem 'therubyracer'

    のコメントアウトを外します。

    で、再度

    rails generate devise user

    を実行。
    すると、必要なファイルが作成されます。
    そして、アプリを起動すると。。

    /home/user/.rvm/gems/ruby-1.9.2-p180@rails32/gems/devise-2.0.1/lib/devise/rails/routes.rb:406:in `raise_no_devise_method_error!':User does not respond to 'devise' method. This usually means you haven't loaded your ORM file or it's being loaded too late. To fix it, be sure to require 'devise/orm/YOUR_ORM' inside 'config/initializers/devise.rb' or before your application definition in 'config/application.rb' (RuntimeError)

    何か怒られました。
    ここで、「ああ、『rails generate devise:install』をしてなかった。。」と、インストールコマンドを実行。

    rails generate devise:install

    すると、

    /home/yama/.rvm/gems/ruby-1.9.2-p180@rails32/gems/devise-2.0.1/lib/devise/rails/routes.rb:406:in `raise_no_devise_method_error!': User does not respond to 'devise' method. This usually means you haven't loaded your ORM file or it's being loaded too late. To fix it, be sure to require 'devise/orm/YOUR_ORM' inside 'config/initializers/devise.rb' or before your application definition in 'config/application.rb' (RuntimeError)

    同じエラーです。どつぼにはまりかけです。

    エラーをよく読むと、
    config/initializers/devise.rb か、
    config/application.rb に、
    require 'devise/orm/YOUR_ORM' を書いてね、と言われているようです。
    どのO/Rマッパーを使うのかがわからないと起動できないみたいですね。
    なので、
    config/application.rb に

    require 'devise/orm/active_record'

    を記述後、インストールコマンドを実行。
    無事、必要なファイルが生成され、deviseを使えるようになりました。

    何事も順序どおりに、端折っちゃだめよというお話でした。

      はてなブックマーク - Rails3 Arel ActiveRecord::Relation考察
      このエントリーをはてなブックマークに追加

      夏が過ぎ風あざみ。

      謎の首痛と腰痛、そして風邪に見舞われた8月でしたが、
      人にうつせば治るというもので、すっかりよくなった山本です。

      今日はRails3のコネタを。

      Arel

      Rails3では、O/RマッパーであるActiveRecordが進化を遂げ、「Arel」というライブラリを使用するようになりました。
      「Arel」については様々なサイトで解説が載ってますが、
      Rails2のfind系メソッドは、呼び出しの際にDBに対してSQLを発行していたのが、
      Rails3では、インスタンスは一旦、 ActiveRecordのサブクラスである、 Relationのオブジェクトとして格納されます。
      全部が全部ではないですが。

      例えば、Userモデルがあるとして、

      user = User.find(1)

      と、findを使ってデータを取得して、userの中身を見ると

      user.class
      => User(id: integer, email: string, .....created_at: datetime, updated_at: datetime)

      と、Userモデルのインスタンスになっていますが、

      user = User.where(:id => 1)

      と、whereを使うと、

      user.class
      => ActiveRecord::Relation

      となります。

      そしてこの時、SQLの処理は行われません。
      あくまで関係の定義が詰まっているだけ。

      この利点は、不要不急なSQL処理が走らないことですね。
      また、これこそが、whereを数珠つなぎにして条件を加える、メソッドチェーンの書き方ができるわけです。

      user = User.where(:id => 1)
      user = user.where("number  > 1")
      user = user.where("type  > 2")

      と書いて、3回もSQLが走ったら大変ですし。

      じゃあいつクエリが発行されるのかというと、
      実際に値を表示するときです。

      例えば、
      puts user

      user.all
      などと書いたときですね。

      本当に値が必要になったときに処理をしてくれるので、リソースの節約につながるのかなと。

      逆効果も

      ただ、使い方を誤ると逆に無駄にクエリを発行することにもなります。

      ある条件のデータの最大と最小を取り出したい、といった時、
      僕はこう書いてました。

      user = User.order("id ASC")
      user_min = user.first
      user_max = user.last

      rails2時代の感覚だと、1行目でレコードのデータが user に格納され、
      2行目と3行目では、ただの配列の操作を行ってデータを格納する処理ですが、
      実際には1行目では user にデータは格納されず、
      2行目と3行目でクエリが発行されてデータが格納されます。
      つまり、1回余分です。

      これじゃあ無駄なので、1行目を

      user = User.order("id ASC").all

      としました。

      こうすれば、1行目で user にデータが格納され、クエリ発行は1回です。

      時代はもうRails3.1

      まだ、Arelに馴染んでなかったといってしまえばそれまでですが、
      rails2の感覚でいると、いろいろ壁があるなーと実感しました。
      今やもう3.1ですし、次はcoffeescriptをやらないといけないかなと思ってます。
      上記は、あくまで自分の解ですが、他の解とか、そもそも論が何かあればツッコミのほどよろしくお願いします。

        はてなブックマーク - RubyKaigi2011に参加してきました
        このエントリーをはてなブックマークに追加

        山本です。
        海の日を含んだ3連休、みなさん、めいいっぱい楽しめたでしょうか。

        さて、私はというと、世のRubyistの祭典、「日本Ruby会議2011」に、河野と参加してきました。
        Rubyistとしての勉強のため、そして、ZENPREを使って、まつもとゆきひろさんのキーノートを配信するためです。

        初めてのRubyKaigi

        今年で最後となるRubyKaigiですが、参加は初めてです。
        ですので、どんな雰囲気なのか、どんな発表があるのか、全く想像がつきませんでした。
        いち地方都市から、不安を覚えながらのこのこと来てしまいました。

        発表の中身

        発表は「大ホール」と「小ホール」に別れ、
        前者はビックネームな方々の発表で、後者はコアデベロッパー向けの技術よりな話、という印象です。
        個人的には、よく使わせていただいている「jpmobile」の話を興味深く聞かせていただきました。

        闇RubyKaigi

        怪しげなタイトルですが、きっと参加者によっては、これがメインだと捉えている人もいるのでしょう。
        本編に登壇できなかった方達の、もしくは本編では発表できないような方達のためのLT大会がありました。
        この闇RubyKaigiでLT枠がもらえるかもしれない、とのことで、
        ZENPREを紹介すべく、お気楽に応募してみました。

        それが誤算でしてね。

        皆さんの発表の面白いこと。
        最初の基調講演を見て、あまりの自分の普通のスライドに焦りを覚えてしましました。
        私の順番は4番目だったのですが、前のお三方は全くすべらない。
        これはまずいと思いつつ、開き直ってやった結果、結構ウケてもらえました。
        ZENPREに興味を持たれた方もいたので、一安心でした。

        Matzのキーノート配信

        RubyKaigi最終日、最後のRubykaigiの最後の基調講演を務めるのは、まつもとゆきひろさんです。
        ZENPREでは、この模様を配信しました。
        タイトルは「三題噺: 振子とPGと百年の言語」と題して、
        振り子を例に挙げて、今後のプログラム業界がどういう道を進んでいくのかという話を中心に講演されました。
        私は、何回はまつもとさんの講演を見ているのですが、
        かなりリラックスして、活き活きとしている講演は初めてだったかなと思います。
        それだけ、この場このイベントを愛してらっしゃるということでしょうか。

        グランドフィナーレ


        最後はスタッフの方が全員壇上に上がり、グランドフィナーレです。
        これだけ大きいイベントを支えているのですから、責任もそれぞれ大きいことでしょう。
        スタンディングオベーションで拍手喝采です。

        謝辞

        ZENPREの配信にあたり、ご協力ご尽力いただきました皆様に、感謝いたします。
        本当にありがとうございました。

        まつもとさんの講演をいつでも

        まつもとさんの講演の模様は、ZENPREにて公開中です。
        見逃した方は、ぜひ一度以下のページからご覧ください。

        zenpre.net/p/rb11mz