我正在使用Nokogiri为XML API编写包装器来构建XML以供提交。
为了让我的代码保持干净,我第一次使用自定义块,只是掌握如何来回传递变量以及它是如何工作的。
我现在正在做的是:
# Generic action
def action(xml, action_title, test=false)
xml.request do
xml.login do
xml.username("my_user")
xml.password("my_pass")
end
xml.action(action_title)
xml.params do
yield
end
end
end
# Specific action
def get_users(city = "", gender = "")
build = Nokogiri::XML::Builder.new do |xml|
action(xml, "getusers") do
xml.city(city) unless city.blank?
xml.gender(gender) unless gender.blank?
end
end
do_stuff_to(build)
end
理想情况下,我希望具体的操作方法如下所示:
def get_users(city = "", gender = "")
action("getusers") do |xml|
xml.city(city) unless city.blank?
xml.gender(gender) unless gender.blank?
end
end
在这样做时,我希望将特定操作方法中当前的其他逻辑移动到通用操作方法,并使用通用操作方法返回do_stuff_to(build)
的结果。
我正在努力解决的问题是如何将xml
对象从action()
传递回get_users()
。为实现这一目标,action()
应该是什么样的?
答案 0 :(得分:1)
事实证明这很简单。需要更改操作方法,如下所示:
def action(action_title)
build = Nokogiri::XML::Builder.new do |xml|
xml.request do
xml.login do
xml.username("my_user")
xml.password("my_pass")
end
xml.action(action_title)
xml.params do
yield xml
end
end
end
do_stuff_to(build)
end
这意味着可以像这样调用特定的动作方法以达到同样的效果:
def get_users(city = "", gender = "")
action("getusers") do |xml|
xml.city(city) unless city.blank?
xml.gender(gender) unless gender.blank?
end
end