用于模型的JSON中的url_for

时间:2011-08-03 15:06:19

标签: 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,
  }

我希望控制器响应的每个对象(使用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)

我也愿意接受其他建议。

1 个答案:

答案 0 :(得分: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