- xml - AJAX/Jquery XML 解析
- 具有多重继承的 XML 模式
- .net - 枚举序列化 Json 与 XML
- XML 简单类型、简单内容、复杂类型、复杂内容
在阅读了 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/
我尝试使用评分最高的答案:Check whether there is an Internet connection available on Flutter app检查我是否连接了互联网,但是我需要
我有点困惑连接是如何工作的。我正在尝试从网格中移除面,并调整连接性,移除未使用的边和顶点。当我使用 mesh.is_valid() 它显示连接问题 Integrity of previous half
我正在尝试编写一个脚本来测试是否可以访问 SVN 存储库,如果我在命令行中键入 svn info,我将得到类似于此的结果 Path: . Working Copy Root Path: [path]
我是一名优秀的程序员,十分优秀!