用于模型的JSON中的url_for

Ajr*_*err 1 ruby-on-rails ruby-on-rails-3.1

在继续之前,我用Google搜索了这个.我知道你为什么不应该在模型中找到url_for的论据,因为这似乎违反了MVC范式.在这个例子中,我不同意,因为它更像是一些资源的API,而不是一个UI.

我创建了一个自定义响应器,并返回一个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,
  }
Run Code Online (Sandbox Code Playgroud)

我希望控制器响应的每个对象(使用respond_with)都有一个封闭的URL,以便在客户端我可以轻松地跟踪在何处发送对给定对象的额外请求(在这种情况下,抓取不同的视图表示取决于哪个小部件已订阅该对象的状态).

我认为最好的方法是在模型方面,因为这似乎是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)
Run Code Online (Sandbox Code Playgroud)

我也愿意接受其他建议.

Ajr*_*err 8

这似乎有用...这是一个黑客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
Run Code Online (Sandbox Code Playgroud)