2011-08-03 1 views
1

これ以上行く前に、私はこれを尋ねました。 MVCパラダイムに一見違反しているので、モデルにurl_forを配置してはいけない理由についての議論を知っています。この例では、UIとしてではなく、一部のリソースのAPIとして機能するようになっているため、私は同意しません。モデルのJSONでurl_forを

私はカスタム応答を作成している、とのリクエストごとに次のようになりますJSONオブジェクトを返す午前:私は、オブジェクトの各コントローラは、同封のURLを持っている(respond_withを使用して)で応答したい

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, 
    } 

をクライアント側では、特定のオブジェクトに対する追加の要求を送信する場所を簡単に追跡できます(この場合は、そのオブジェクトの状態にサブスクライブしているウィジェットによって異なるビュー表示を取得します)。

私はこれを行うための最善の方法はモデル側にあると思います。それは、Railsが望んでいるようです。単にurlで関数を追加してから、as_json(:methods =>:url)を使うだけです。残念ながら、url_forはモデル側では利用できず、ActiveRecord :: BaseにRails3.1互換の方法を含めることができませんでした。

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