fc2ブログ

2023.11 «  - - - - - 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 27 28 29 30 31 - - - - - - » 2024.01
TOP > CATEGORY > [2.0]Controller

TOP | NEXT

Rails 2.0・その15(コントローラでの例外処理をまとめて記述) 

2008年03月03日 ()
コントローラで例外が起きた時に実行される処理を、rescue_fromを使ってまとめて書くことができます。

言ってみれば、コントローラ内にあるたくさんのメソッドごとに例外処理を書くのではなくて、1コントローラにつき1回だけ例外処理を書くようにできるということです。

例を見てみましょう。

app/controllers/people_controller.rb



  class Exception1 < Exception # 例外クラスを定義する
  end

  rescue_from Exception1, :with => :handle_ex1

  def action1
    raise Exception1
    render(:text => 'action1')
  end

  def action2
    raise Exception1
    render(:text => 'action2')
  end

  protected
  def handle_ex1
    render(:text => 'handle_ex1')
  end




と書きますと、action1 や action2 で発生した同じ名前の例外を、まとめてhandle_ex1で処理できるようになります。

実際、このまとめて書く処理の方法がどう役に立つのか・・・分かりませんorz

ActiveRecordとかNotAuthorizedとか、何か具体的な使い道が思いついた方はコメントください、という他力本願マンセーな弥生の宵

【広告】

スポンサーサイト



[2008.03.03(Mon) 00:24] [2.0]ControllerTrackback(0) | Comments(0) 見る▼
↑TOPへ

Rails 2.0・その7(ベーシック認証が簡単にできる)  

2008年02月05日 ()
ベーシック認証っていうと .htaccess ファイルが真っ先に頭に浮かびますが、Rails2.0では超カンタンに認証できます。

コントローラに authenticate_or_request_with_http_basic を使ってユーザ名とパスワードを指定するだけでできちゃいまーす。

以下はその例です。

class DiariesController < ApplicationController
  before_filter :auth, :only => :limited # limited という名前のメソッドだけ有効にする

  def limited
    render(:text => '認証がないとこれはみれません')
  end

  def not_limited
    render(:text => '認証がなくてもこれはみられます')
  end

  private
  def auth
    authenticate_or_request_with_http_basic do |user, pass|
      user == 'r_sakamoto' && pass == 'ahoaho_man'
    end
  end
end



http://localhost:3000/diaries/limited

にアクセスするとベーシック認証が行われます。


【広告】

[2008.02.05(Tue) 23:48] [2.0]ControllerTrackback(0) | Comments(2) 見る▼
↑TOPへ


COMMENT

Ruby勉強中です。 by tkmrkt
Ruby勉強中のものです。
スゴイ情報量のブログで、いろいろ見せてもらっています。
Railsとかは、仕事で使ってるのでしょうか。
ブログもはじめて間もないですが、よかったら
情報交換させてください。よろしくお願いします。

いえいえとんでもない by 自分
Rubyに関しては、仕事で使う機会がないのでむりくり自分で仕事の中に取り込んでいます。
連想配列やら型変換やら、正直PHPやらPerlの方が楽だなと思うことは多々ありますけれど、プログラミングしていて楽しいのはRubyであることには違いありません。
ソースコードもスッキリしていて後から読み返してもつわりが来ませんし。

コメントを閉じる▲

Rails 2.0・その5(view ファイル名振り分けカスタマイズ・携帯キャリアごと振り分けの例)  

2008年02月02日 ()
自分でカスタマイズして、view ファイル名の読み込みを振り分けることができます。

例えば、ケータイ(DoCoMo, au, softbank)ごとに view のファイルを変えたいわよ、なんて時は、以下のようにすると吉でしょう!

今回はコントローラの名前の例として「Mobiles」を使いますが、これは何の名前でもよかよ!


config/initializers/mime_types.rb に以下を書き加える。

Mime::Type.register_alias "text/html", :docomo
Mime::Type.register_alias "text/html", :au
Mime::Type.register_alias "text/html", :softbank



app/controllers/application.rb に以下を書き加える。

  before_filter :mobi_filter

  def mobi_filter
    if /\ADoCoMo/ =~ request.env["HTTP_USER_AGENT"]
      request.format = :docomo
    elsif /\AKDDI|\AUP.Browser/ =~ request.env["HTTP_USER_AGENT"]
      request.format = :au
    elsif /\ASoftBank|\AMOT|\AVodafone|\AJ-PHONE/ =~ request.env["HTTP_USER_AGENT"]
      request.format = :softbank
    else
      request.format = :docomo # どれにも当てはまらないときは、とりあえず DoCoMo 扱いにする
    end
  end



※ \A という正規表現は、改行もひっくるめて文字列全体を扱った場合の本当の先頭、みたいた意味だそうですよ。


app/controllers/mobiles_controller.rb

class MobilesController < ApplicationController
  def index
    respond_to do |format|
      format.docomo
      format.au
      format.softbank
    end
  end
end



そして、

app/views/mobiles/index.docomo.erb
app/views/mobiles/index.au.erb
app/views/mobiles/index.softbank.erb

ファイルにそれぞれのキャリアの HTML を書けば良いというわけです。

うーん、結構簡単に携帯サイトに取りかかれそうですね。すごいなあ。

[追記 08/02/08]
でもよく考えてみたら、全てのコントローラに、この respond_to ~ end を書くのは、面倒ですね。

私の知恵を絞って考えたのが以下のアイディアです。もう脳みそがありませんのでマルコメ味噌を補充必須。

もっといい方法があるかもしれませんので、是非賢者のアドバイスをお願いします。

まず、respond_to ~ end を共通ルーチンとして外のファイルに押しやります。

app/helpers/mobile_switch_controller_helper.rb

module MobileSwitchControllerHelper
  def mobile_switch
      respond_to do |format|
        format.docomo
        format.au
        format.softbank
      end
  end
end



次に、このヘルパを全てのコントローラで使えるように以下の行を app/controllers/application.rb に追加します。

  include MobileSwitchControllerHelper



そいでもって、この mobile_switch メソッドを、各コントローラのメソッドの最後で呼んであげます。

app/controllers/mobiles_controller.rb

class MobiController < ApplicationController
  def index
    ・
    ・
    (なんかの処理)
    ・
    ・
    mobile_switch
  end

  def delete
    ・
    ・
    (なんかの処理)
    ・
    ・
    mobile_switch
  end
end



みたいな?(by 滝沢美和子魂)

【広告】

[2008.02.02(Sat) 21:54] [2.0]ControllerTrackback(0) | Comments(0) 見る▼
↑TOPへ

Rails 2.0・その3(map.resources の has_one が扱いやすく)  

2008年01月25日 ()
map.resources で has_one を使ったときに、マッピングがされるようになりました。

[Rails 2.0.2]

map.resources :birds, :has_one => :brain



とやりますと、

/birds/:bird_id/brain

というルートとか他多数のルートが自動的に作成されます。

これは rake routes コマンドで確かめられます。

とにかくroutes関係で困ったら

rake routes



をしましょう。

それで、この /birds/:bird_id/brain にアクセスすると、例えば、http://localhost:3000/birds/1/brain にアクセスすると、

app/controller/brains_controller.rb の show メソッドが呼ばれます。(rake toues コマンド参照)

注意すべきは、複数形の brains コントローラだということです。単数形の brain ではありません。

これで、controller の名前は常に複数にした方がよさそうな兆候が見えてきました。


一方、Rails 1.2.3 にはこの機能はありませんでした。

【広告】

[2008.01.25(Fri) 20:06] [2.0]ControllerTrackback(0) | Comments(0) 見る▼
↑TOPへ

Rails 2.0・その2(map.resourcesに名前空間を付けられる)  

2008年01月25日 ()
map.resources に名前空間を付けて、アプリ階層を整理しやすくしたそうです。

[Rails 2.0.2]

map.namespace(:myspace) do |myspace|
  myspace.resources :books, :member => {:method1 => :post}
end



としますと、ディレクトリ名の頭に /myspace が加わります。この myspace のことを名前空間(namespace)と呼んでいます。

myspace はテキトーに自分で好きな名前を付けることができます。

上記の設定例ですと、コントローラの場所が

app/controllers/myspace/books_controller.rb

になります。しかもコントローラ名は Myspace::BooksController < ApplicationController と宣言しなければなりません。

URLも

http://localhost:3000/myspace/books

みたいに、頭に myspace が加わるという訳でした。

Rails 1.2.3 にはこの機能はありませんでした。


【広告】

[2008.01.25(Fri) 01:21] [2.0]ControllerTrackback(0) | Comments(0) 見る▼
↑TOPへ

TOP | NEXT