gpt4 book ai didi

ruby-on-rails - Rails RESTful to_xml - 如何实现连通性?

转载 作者:数据小太阳 更新时间:2023-10-29 02:55:29 28 4
gpt4 key购买 nike

在阅读了 Leonard Richardson 和 Sam Ruby 合着的 RESTful Web Services 一书后,在我看来,rails 的 to_xml 方法并不像它应该的那样安静。具体来说,本书介绍了面向资源的体系结构,其原则之一是连通性:资源的表示不仅应包含资源的数据,还应包含与其他资源的链接。

但是,当 Rails 构建资源时,它会通过推迟到 [model]#to_xml 来实现对 xml 表示的请求。此方法无法访问普通路径助手,因此指向其他资源的任何链接仅由它们的 ID 指示,而不是由它们的 URI 指示。

我现在已经解决了这个问题,但解决方案似乎不是很可靠:给定一个具有嵌套雇员的雇主资源,以下代码(某种程度上)将 uris 添加到它们的 xml 序列化中:

class Employee < ActiveRecord::Base

include ActionController::UrlWriter

belongs_to :employer

def to_xml(options = {})
options[:procs] = [ Proc.new {|options| options[:builder].tag!('uri', employer_employee_path(employer, self)) } ]
if options[:depth].nil?
options[:depth] = 1
end
if options[:depth] != 0
options[:depth] -= 1;
options[:include] = [:employer]
end
super(options)
end
end

class Employer < ActiveRecord::Base

include ActionController::UrlWriter

has_many :employees

def to_xml(options = {})
options[:procs] = [ Proc.new {|options| options[:builder].tag!('uri', employer_path(self)) } ]
if options[:depth].nil?
options[:depth] = 1
end
if options[:depth] != 0
options[:depth] -= 1;
options[:include] = [:employees]
end
super(options)
end
end

UrlWriter 允许我正确创建资源的路径(但不是完整的 uri。域必须由我的 Web 服务的客户端粘贴到路径上)。现在模型负责它们自己的 uri,并负责包含任何连接资源的表示。我使用 :depth 选项来避免无限递归。

这个方法可行,但是如前所述,它似乎不太正确,所有重复项。有没有其他人有同样的问题,有没有其他人对如何在 xml 表示中获取 uris 有更好的想法?

最佳答案

您可以使用 :methods 选项来包含其他值。例如。

# in controller
employer.to_xml(:include => :employees, :methods => [:uri])

class Employee < ActiveRecord::Base
include ActionController::UrlWriter
belongs_to :employer

def uri(options = {})
polymorphic_path([employer, self])
end
end

class Employer < ActiveRecord::Base
include ActionController::UrlWriter
has_many :employees

def uri(options = {})
polymorphic_path(self)
end
end

注意我在这里使用了 polymorphic_path。这是一种更通用的路径方法,您可能会通过它找到更多抽象。

但是,我认为这不是一个很好的解决方案。在模型中包含 UrlWriter 很麻烦,如果您有大量路由,可能会花费很长时间。另一种方法是使“uri”成为一个简单的访问器方法。

# in model
attr_accessor :uri

然后您可以在 Controller 中设置模型的 uri。不幸的是,这也很困惑。

employer.uri = polymorphic_path(employer)
employer.employees.each { |e| e.uri = polymorphic_path([employer, e]) }
employer.to_xml(:include => :employees, :methods => [:uri])

关于ruby-on-rails - Rails RESTful to_xml - 如何实现连通性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1255426/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com