在继续之前,我用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)
我也愿意接受其他建议。
答案 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