2011-12-06 8 views
1

私のモデルには、ユーザエージェントを検出する方法があります。私はどのように私のすべてのコントローラメソッドでそれを利用できるようにすることができますか?コントローラの可用性モデルのレンダリング

モデル:

def is_iphone_request? 
     if request.user_agent =~ /iPhone/ 
     return true 
    end 
    end 

コントローラ(エラーがスローされます):

def index 
    @user_agent = is_iphone_request? 
end 

どのように私はこれを達成することができますか?どんな助けでも大歓迎です。

答えて

3

モデルではなくApplicationControllerにメソッドを入れてください。

+1

あなたはApplicationControllerにでこれを置くなぜあなたは説明できますか?私は質問者と全く同じ本能を持っていました。これはモデルの – ctilley79

+0

にこれを入れるのは理にかなっているようですが、 'request'はモデルではアクセスできないためです。さらに、リクエスト変数を処理することは、通常、モデルではなくコントローラが行うべきことです。 – Mischa

+0

彼の状況と私の違いが分かると思う。説明をありがとう – ctilley79

0

なぜユーザーエージェントチェックを要求したのか分かりません。コントローラ中心の動作のようです。また、使用可能なコントローラに要求属性があります。

0

requestは(次のコードでNameErrorを取得します)のモデルでは利用できませんが、あなたの現在の問題は、メソッドの定義にself.が欠落しているため、コントローラがNoMethodErrorを投げているということです。私はrequestが利用できないので、あなたがNameErrorを取得します、言ったように

MyModel.is_iphone_request? 

しかし:次に

class MyModel < ActiveRecord::Base 
    def self.is_iphone_request? 
    if request.user_agent =~ /iPhone/ 
    return true 
    end 
end 

、あなたのコントローラでは、あなたが使用することができます。それ(self.を追加することによって)クラスメソッドくださいモデルでは

お客様の方法is_iphone_request?は、ApplicationController(通常のprivateメソッド)に掲載されているはずです。また、それをダウントリムすることができます

class ApplicationController < ActionController::Base 
    ... 
    private 
    def is_iphone_request? 
    request.user_agent =~ /iPhone/ ? true : false 
    end 
end 

を次に、あなたのコントローラでは、あなたが使用することができます。

is_iphone_request? 
関連する問題