2011-08-03 2 views
1

앞으로 나아 가기 전에 나는 이것을 봤습니다. MVC 패러다임을 위반 한 것처럼 모델에 url_for가 없어야하는 이유에 대한 주장을 알고 있습니다. 이 인스턴스에서는 UI가 아닌 일부 리소스에 대해 API로 더 많이 기능하므로 동의하지 않습니다.모델에 대한 JSON의 url_for이

나는 사용자 정의 응답을 만든 및 요청에 따라 다음과 같습니다 JSON 개체를 반환하고

는 :

obj = { 
    json: resource.as_json, 
    request_url: params[:id] ? resource_url : collection_url, 
    partial: get_partial(:partial, options), 
    flash: flash, 
    flash_partial: get_partial(:flash, options), 
    user: @current_user, 
    status: response.status, 
    } 

나는 컨트롤러가 URL을 동봉 가지고 (respond_with 사용)로 응답 객체의 각을 원한다 그래서 클라이언트 측에서 주어진 객체에 대한 추가 요청을 보내는 위치를 쉽게 추적 할 수 있습니다 (이 경우 해당 객체의 상태에 가입 한 위젯에 따라 다른 뷰 표현을 얻습니다).

레일스가 원했던 것처럼 보이는 가장 좋은 방법은 모델 측면에 있다고 생각합니다. url과 함께 함수를 추가 한 다음 as_json (: methods => : url)을 사용하면됩니다. 불행하게도, url_for는 모델 측에서 사용할 수 없으며 Rails3.1 호환 방법을 ActiveRecord :: Base에 포함시키는 방법을 찾을 수 없었습니다.

class << ActiveRecord::Base 
    def url 
    url_for self 
    end 
end 

Model.new.as_json(:includes => :url) 

다른 대안도 있습니다.

이 작동하는 것 같다

답변

7

... 그것은 해킹의 비트는 IMO의 :

class << ActiveRecord::Base 
    include Rails.application.routes.url_helpers 
    include ActionDispatch::Routing::UrlFor 

    def default_url_options 
    { :host => 'localhost:3000' } 
    end 

    def url 
    url_for(self) 
    end 

    def as_json options 
    super options.merge(:methods => :url) 
    end 
end