• ブログ
  • ふぉとす
  • キーワード
  • ブックマーク
  • 写真
  • ログイン

Title

« ubuntu7.10でデュアルディスプレイ | tokyobikeで多摩川に行ってきました »
  • Rubyの名前空間に苦しむ。そしてちょっと勉強。 2007-10-20 00:00:00

     作ったあるメソッドを使うとき、 attr_accessor みたいな書き方をしたかったのだけど、Rubyの名前空間にちょっとハマってしまった。復習しておこうっと。

     それはともかく、attr_accessor はどうやって定義されているのかと思ってちょっと調べてみると、Moduleクラスのプライベートインスタンスメソッドとして定義されていた。ClassクラスはModuleクラスのサブクラスだからか。なので、同じようにやってみる。
    test.rb

    class Module
      private
    
      def set_special_url(args)
        define_method :special_url do
          args
        end
      end
    end
    

    として、こいつをrequireしてやると

    #!/usr/bin/ruby
    require 'test'
    
    class Lesson
      set_special_url :controller => 'test', :action => 'login'
    
      def index
        puts special_url[:controller]
        puts special_url[:action]
      end
    end
    
    Lesson.new.index
    

    実行結果は、

    test
    login
    

    となった。なるほど。

     次にRailsでやってみる。
     ジャンプ先のURLを一度設定しておけば、どこでもそれが使えるという機能と、ステートを保持するセッションを持ち、それをインスタンス変数としてアクセスできる機能を持つpluginを作ってみる。

    module Spoon
      private
    
      def say
        @word ||= session[:word] || "I'm thinking nothing"
      end
    
      def mind=(word)
        session[:word] = word
        @word = word
      end
    
      def thinking(word)
        self.mind = word
      end
    
      class ::Module
        private
    
        def set_jump_url(args)
          define_method :jump_url do
            args
          end
        end
      end
    end
    

    こんな感じ。
     Moduleクラスをオーバライドしているのは前述のとおり。::をModuleの頭につけてあげないと、Spoon::Moduleクラスの定義になってしまうので注意。
     sayメソッドとmindメソッドは、それぞれ@wordへのアクセサになっている。sessionを使っているのは、アクセスされるたびにインスタンスが生成されるので、@workがそのたびに異なるものになってしまうため。だったらセッションだけでもいい気もするけど、こっちのほうがシンプルだと思う。
     thinkingメソッドは、mindメソッドを確実に呼ぶために定義した。selfレシーバをつけてあげないと、mindがメソッドなのかローカル変数なのか、区別がつきにくい(というかコントローラのアクションの中ではローカル変数と判断される)のだ。このあたりは、acts_as_authenticatedをもろに参考にしました。

    で、ApplicationControllerでは

    class ApplicationController < ActionController::Base
      include Spoon
      set_jump_url :controller => 'test', :action => 'index'
    end
    

     こうしてやる。これで、どのコントローラでも、redirect_to jump_url みたいな感じで、設定したジャンプ先のURLが使えるようになる。
     それからふたつのコントローラを

    class TestController < ApplicationController
      def index
        render :text => say
      end
    
      def set_mind
        thinking "I'm hungry..."
        redirect_to jump_url
      end
    end
    
    class KaeruController < ApplicationController
      def index
        redirect_to jump_url
      end
    end
    

     こんな感じで定義する。
     もしjump_urlをtestコントローラだけで使いたいときは、set_jump_urlをtestコントローラだけで使えばいい。そうすれば、kaeruコントローラではjump_urlが使えない(未定義でエラーになる)。

     

    Commentコメント(0) Pageリンク元(203) Append 250
  • MG ユニコーンガンダムVer.Ka
    メディア: おもちゃ&ホビー
    しゅごキャラ! 3 (3) (講談社コミックスなかよし)
    メディア: コミック
« ubuntu7.10でデュアルディスプレイ | tokyobikeで多摩川に行ってきました »

プロフィール

おおいしつかさ

Amazon商品の一覧

人気の記事ベスト10

  • 1.apache+mod_proxy_balancer+mongrelでRailsを動かす方法
  • 2.Perlでevalを使ってみる
  • 3.バージョン管理をsubversionからgitに移行してみた
  • 4.tokyobikeのドロップハンドル化
  • 5.ubuntu8.04でデュアルディスプレイを使う
  • 6.restful_authenticationを使ってみた
  • 7.URLなど、長い英字を折り返して表示する方法
  • 8.Rspecでコントローラのspecファイルを書く
  • 9.RailsとPostfixで受信メールを処理する方法
  • 10.フラグメントキャッシュをRailsで使う。

コメント

  • ユル(プログラマが若隠居をしたら)
  • ユル(風邪ひいた)
  • ユル(バイクがへたくそになっていた)
  • おおいしつかさ(便利になって不便になる)
  • 武石(便利になって不便になる)
  • ユル(劇場版 天元突破グレンラガン)
  • ユル(フラニーとゾーイー (新潮文庫): サリンジャー, 野崎 孝: 本)

過去の記事

2006年
12月
2007年
1月 2月 3月 4月 5月 6月 7月 8月 9月 10月 11月 12月
2008年
1月 2月 3月 4月 5月 6月 7月 8月 9月 10月 11月

キーワード一覧

ActionScript AmazonResources git javascript kaeruspoon milook NSR Objective-C Rails Ruby Ruby on Rails subversion Thin tokyobike ubuntu VAIO VAIO typeZ Waves Xen ぐりぐり カンタロー スノボー ドトール ドライブ バイク プログラミング ユルさん 執筆 日本酒 模型 真中洋嗣 自転車

Youtube

ニコニコ動画