如何有条件地选择两种方法之一来接收相同的块

时间:2013-09-27 08:13:34

标签: ruby

我试图改变依赖于变量req的代码的过程,你可以在这里看到:

@res = @conn.post do |request| if req == 'post'
@res = @conn.get do |request| if req == 'get'

问题在于这似乎引发了一个错误:

stack.rb:89: syntax error, unexpected end-of-input, expecting keyword_end
user2.send_csr

我的问题是,为了避免这个问题,我需要改变什么?如果您需要有关我的代码的更多信息:

def send(req,ww,text1=nil,text2=nil)
@conn = Faraday.new 'https://zombo.de/rest', :ssl => {:verify => false}
@conn.basic_auth(@username,@password)
@res = @conn.post do |request| if req == 'post'
@res = @conn.get do |request| if req == 'get'
 request.url ww
 request.headers['Content-Type'] = text1 unless text1 == nil
 request.body = text2 unless text2 == nil
end
puts @res.body
end

def send_csr
  send('post','csr','text/plain',"#{File.read(@csr[0..-5])}")
end

user2.send_csr

3 个答案:

答案 0 :(得分:2)

如果你扩展你的代码怎么办?添加一些格式并更改块中的内容?

def send(req, ww, text1=nil, text2=nil)
  @conn = Faraday.new 'https://zombo.de/rest', :ssl => {:verify => false}

  @conn.basic_auth(@username,@password)

  @res = @conn.post { |request| handle_request(request) } if req == 'post'
  @res = @conn.get { |request| handle_request(request) } if req == 'get'

  @res.body
end

def handle_request request
  request.url ww
  request.headers['Content-Type'] = text1 unless text1 == nil
  request.body = text2 unless text2 == nil
  request
end

def send_csr
  send('post','csr','text/plain',"#{File.read(@csr[0..-5])}")
end

user2.send_csr

答案 1 :(得分:1)

无法按照您的要求放置修复后if,因为从技术上讲,它位于您想要传递到获取或发布的块的中间。

你可以这样做:

@res = @conn.get do |request| 
 request.url ww
 request.headers['Content-Type'] = text1 unless text1 == nil
 request.body = text2 unless text2 == nil
end if req == 'get'

但这需要您为每种情况重复代码块。此外,我建议在长时间阻止后修复后修复条件,以后在阅读代码时很难发现它们。

所以这个语法,使用send可能最适合你(因为你的字符串匹配方法名称,所以它有效)

@conn.send(req) do |request| 
 request.url ww
 request.headers['Content-Type'] = text1 unless text1 == nil
 request.body = text2 unless text2 == nil
end

答案 2 :(得分:1)

法拉第的postget方法调用run_request

run_request(method, url, body, headers)

您也可以这样做:

def send(req, ww, text1=nil, text2=nil)
  @conn = Faraday.new 'https://zombo.de/rest', :ssl => {:verify => false}
  @conn.basic_auth(@username, @password)
  headers = text1 && {'Content-Type' => text1 }
  @res = @conn.run_request(req.to_sym, ww, text2, headers)
  puts @res.body
end

我正在传递req.to_sym因为run_request需要一个符号(:post而不是"post"),而不是设置urlbody块中的headers,我也正在传递它们。

也许您应该重命名一些变量并用本地变量替换实例变量:

def send(method, url, content_type=nil, body=nil)
  conn = Faraday.new 'https://zombo.de/rest', :ssl => {:verify => false}
  conn.basic_auth(@username, @password)
  headers = content_type && {'Content-Type' => content_type }
  res = conn.run_request(method.to_sym, url, body, headers)
  puts res.body
end