2011-12-06 2 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? 

을하지만 말했듯이, 당신은 얻을 것이다 : 그것 (self.를 추가하여) 클래스 메소드 확인 :

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

그런를, 컨트롤러, 당신은 사용할 수 있습니다 모델에서.

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? 
관련 문제