2012-08-02 4 views
6

Rails 3.2 애플리케이션의 모델로 JSON 서비스를 어떻게 사용할 수 있습니까?JSON 서비스를 Rails 모델로 사용

JSON 요청에 모델 메서드를 연결하고 싶습니다.

  • MyModel.create

    는 기록을 검색하고 선호하는 방법은 무엇입니까 모델 객체

에 JSON 응답을 디코딩하는 JSON 요청을 생성하는 새로운 기록

  • MyModel.find를 제작하는 JSON 요청을 생성합니다 이러한 유형의 기능을 구축하려면? 하나의 옵션은 사용자 정의 DataMapper 어댑터를 만드는 것입니다.

    감사합니다.

    업데이트 : 이것은이 경우에하지 않는, 특정 방법으로 응답 할 JSON 서비스를 필요로하기 때문에 내가 ActiveResource을 사용할 수 없습니다
    참고.

  • 답변

    3

    짧은 답변 : 귀하의 JSON 서비스에 따라 다릅니다.

    처음에는 서비스가 RESTful입니까? 그렇다면 운이 좋았을 것입니다. ActiveResource는 dead이므로 코드 사용 자체는 createfind과 같은 래퍼 메서드 집합을 만들기위한 좋은 출발점을 제공하여 API에 액세스하고 ActiveRecord에서 레코드를 생성하고 쿼리하는 방식으로 레코드를 조작합니다. DB. rails is built around RESTful-ness이기 때문에 API가 RESTful 인 경우 비교적 쉽습니다. 따라서 두 클래스 간의 매핑이 훨씬 더 명확 해집니다.

    This article는 잘 요약 :

    레일은 매우 쉽게 REST의 원칙을 따르고 웹 브라우저와 프로그래머블 웹과 동일하게 작동 웹 서비스를 구축 할 수 있습니다. 실제로 이러한 단순성은 이러한 원칙을 따르는 것으로부터 비롯됩니다. 우리는 고객에게 적절한 HTTP 메소드를 사용하여 작성한 리소스를 작성, 읽기, 업데이트 또는 삭제하는 방법을 알려줄 필요가 없었습니다. 우리가해야 할 일은 우리 고객을 올바른 장소로 안내하는 것입니다.

    서비스가 아닌 경우 내가 생각하는 다른 질문에 대한 코멘트에서 판단하는 경우는 아마 인, 편안하고, 당신은 당신의 일이 당신을 위해 잘라해야합니다. ActiveModel은 createActiveRecord::Persistence에 정의되어 있고 findActiveRecord::FinderMethods에 정의되어 있습니다. ActiveModel에 없습니다.ActiveResource는 인터페이싱하는 서비스 유형 (즉, RESTful 및 몇 가지 다른 것들)에 대한 가정을하기 때문에이를 상당히 쉽게 재현 할 수 있습니다. 그 검증 시스템, 직렬화 메소드, 속성 변경의 더러운 추적, 콜백 (before_save, after_save 등), 번역/현지화 : ActiveModel가 제공하는 것에

    모델을 다루는 레일 매우 유용하게 만드는 다른 모든 물건 등등. 이것들은 모두 매우 유용한 기능이지만 API 호출을 래핑하는 문제는 여전히 남아 있습니다.

    1. 먼저 API를 자세히 살펴보고이되고 얼마나 가까운 알아낼 :

      그래서 여기가 내 경험이 제한적이기는하지만 (즉에 대한 내 마지막 주 참조)에 따라 추천 할 것입니다 무엇 평안한. 이 아닌 경우 RESTful 인 경우 RESTful 서비스처럼 처리 할 수 ​​있도록이 문제를 해결하는 방법을 고려해야합니다. 이를 수행하는 방법에 대한 좋은 참고 자료는 O'Reilly의 RESTful Web Services (특히 2 장 "웹 서비스 클라이언트 작성")입니다.

    2. create, find 및 기타 ActiveRecord와 같은 기능을 구현하는 API 래퍼를 만듭니다 있다. 실제로 Net :: HTTP로 작업하기보다 실제로 API를 요청할 때 Faraday 또는 HTTParty과 같은 보석을 사용하고 싶을 것입니다. (나는 결코 DataMapper를 사용한 적이 없기 때문에 논평 할 수 없습니다.)
    3. 래퍼 클래스를 레일즈 모델과 같은 것으로 만들기 위해 사용하려는 ActiveModel 요소를 모두 포함합니다 : 유효성 검사, 직렬화 등. 레일 4에서는 새로운 베어 본을 사용하여 모든 것을 실제로 포함하십시오 ActiveModel::Model.

    JSON 서비스를 Rails 모델로 사용하는 방법을 많이 알게 될 것입니다.

    레코드의 경우 실제로 이런 종류의 구현에 대한 경험은 XML API에 액세스하기위한 API 래퍼 (작업 중)를 작성하는 것으로 제한됩니다. 래퍼에는 API에 대한 쿼리의 유효성 검사를위한 ActiveModel 유효성 검사기가 포함 된 클래스가 있습니다. ActiveModel 유효성 검사기가 API가 올바르게 액세스되도록 보장하는데 정말 유용하다는 것을 알았지 만 래퍼는 API에서 레코드를 가져 오기위한 것이지 실제 생성하거나 업데이트하는 것이 아니므로 인터페이스가 예상보다 훨씬 쉽습니다. 너는 지어 줄거야.

    +0

    종합적인 답변을 해주셔서 감사합니다. 다행스럽게도 JSON 서비스는 RESTful입니다. ActiveResource에서 예상하는 방식으로 응답하지 않는다는 것입니다. 내가 죽었다는 것을 알았으니 ActiveResource를 피할 것이고, 대신 당신이 링크 한 DZone 기사를 읽을 것이다. 다시 한 번 감사드립니다! – gjb

    +0

    오, 좋은 소식입니다!이 경우 작업이 너무 어려워서는 안됩니다. ActiveResource를 사용하지 않더라도 코드가 어떻게 작동하는지 보려고 할 수도 있습니다. –

    +0

    아직 작업 중이라면 도움이 될만한 몇 가지 보석이 있습니다. https://github.com/filtersquad/api_smith https://github.com/remiprev/her https://github.com/ apotonick/roar –

    0

    나는 이걸 내 보석 "otrs_connector"에서 사용합니다 ... 귀하의 서비스에는 효과가 없지만 어떻게 할 수 있는지 아이디어를 줄 수 있습니다. 약간 리팩토링해야하지만 제대로 작동합니다.

    +0

    감사에 접근 자신의 예를 들면, 나는 이것 좀 봐해야합니다. – gjb

    1

    난 당신이 ActiveResource 찾고있는 생각, 당신은 ActiveModel을 구현하기 위해 this linkthis (apidock)

    +0

    감사합니다. 불행히도 이것은 JSON API가 어떤 방식으로 응답해야 할 필요가있는 것처럼 보입니다. 예를 들어 새로운 레코드가 JSON으로 표현 된 것이 아니라 새로운 레코드가 생성되면 'OK'로 응답합니다. – gjb

    1

    이 작업을 수행하는 가장 좋은 방법을 참조하십시오 편안하고 JSON의 API와 함께 작동하도록하는 대신 ActiveRecord의 그것을있다 사용할 수 있습니다. 이 railscast은 기본 사항을 다룹니다.

    +0

    고마워, 나는 그것을 살펴볼 것이다. DataMapper에 비해 ActiveModel의 장점은 무엇입니까? – gjb

    +0

    ActiveModel은 Rails에 포함되어 있으므로 즉시 사용할 수 있습니다. –

    0

    웹 서비스가 일반적인 "레일 방식"을 벗어나면 HTTParty을 권하고 싶습니다. 원하는대로 응답하는 웹 서비스에 대해 Proxy을 만드는 것은 꽤 쉽습니다.

    는 예를 들어, 여기에 트위터 타임 라인을

    class Twitter 
        include HTTParty 
        base_uri 'twitter.com' 
    
        def initialize(u, p) 
        @auth = {:username => u, :password => p} 
        end 
    
        # which can be :friends, :user or :public 
        # options[:query] can be things like since, since_id, count, etc. 
        def timeline(which=:friends, options={}) 
        options.merge!({:basic_auth => @auth}) 
        self.class.get("/statuses/#{which}_timeline.json", options) 
        end 
    
        def post(text) 
        options = { :query => {:status => text}, :basic_auth => @auth } 
        self.class.post('/statuses/update.json', options) 
        end 
    end 
    
    twitter = Twitter.new(config['email'], config['password']) 
    pp twitter.timeline 
    
    +0

    감사합니다. 흥미로운 대안이지만 JSON 서비스가 전통적인 Rails 모델처럼 작동하는 것을 선호합니다. – gjb

    관련 문제