如何访问我在调用块I的方法中的变量?

时间:2014-04-05 12:09:33

标签: ruby block

我正在使用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()应该是什么样的?

1 个答案:

答案 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