Ruby 如何修改参数

Ruby how to modify parameters

提问人:user2968505 提问时间:6/28/2016 更新时间:6/29/2016 访问量:731

问:

所以我有这个代码,我的目标是将任何空字符串转换为空

def convert_empty_strings_to_null
  if request.patch? || request.post?
    convert_empty_strings_to_null_rec(request.params)
  end
end

def convert_empty_strings_to_null_rec(param)
  param = nil if param.empty? if param.is_a?(String)
  param.all?{|v| convert_empty_strings_to_null_rec v} if param.is_a?(Array)
  param.all?{|k,v| convert_empty_strings_to_null_rec v} if param.is_a?(Hash)
end

但是我是 ruby on rails 的新手,我发现它按值而不是按引用发送参数,因此没有更改参数,我该如何解决这个问题?

Ruby-on-Rails Ruby 按引用传递

评论

0赞 Raffael 6/28/2016
请注意,这并不能取代任何内容。请改用。如果是哈希,请使用 .all?mapparam.map{ |k,v| [x,y] }.to_h

答:

3赞 Harsh Trivedi 6/28/2016 #1

首先,这是您的方法,以保持更改持久性:convert_empty_strings_to_null_rec

def convert_empty_strings_to_null_rec(param)
      if param == ""
        updated_param == nil
      elsif param.is_a?(Array)
        updated_param == param.map{|x| nil if x.empty? }        
      elsif param.is_a?(Hash)
        updated_param = {}
        param.each do |k, v| 
            if v.empty?  
                updated_param[k] = nil
            else
                updated_param[k] = v
            end
        end
      end
      return updated_param
end

此外,我从你的问题中假设这是一种行动方法。它应该更新以捕获返回的方法。convert_empty_strings_to_nullconvert_empty_strings_to_null_rec

def convert_empty_strings_to_null
  if request.patch? || request.post?
    updated_params = convert_empty_strings_to_null_rec(request.params)
  end
  # you can use the updated_params here on in this action method
end

希望对您有所帮助:)

3赞 Raffael 6/28/2016 #2

我假设“空”是指带零的字符串,这意味着仅由空格组成的字符串应该保持不变。(否则,会成为你的朋友。blank?strip

def convert_empty_strings_to_nil
  if request.patch? || request.post?
    request.params.each do |key, value| 
      request.params[key] = convert_empty_strings_to_nil_rec(value)
    end
  end
end

def convert_empty_strings_to_nil_rec(param)
  case param
  when String
    param.empty? ? nil : param
  when Array
    param.map{ |v| convert_empty_strings_to_nil_rec(v) }
  when Hash
    param.map{ |k,v| [k, convert_empty_strings_to_nil_rec(v)] }.to_h
  else
    param
  end
end

评论

0赞 user2968505 6/28/2016
这将解决问题,但显然运算符“=”不是为参数定义的,有没有办法在不创建新对象的情况下迭代参数并更改元素本身?
0赞 Raffael 6/28/2016
有两种方法:(1)将返回的修改后的参数哈希存储在新的实例变量中并使用它们。(2)是的,知道它始终是一个哈希值,我们可以就地修改它的值。我应该详细说明吗?request.params
0赞 user2968505 6/29/2016
谢谢,我通过对每个值的第一级 request.params 调用递归调用来解决它
0赞 Raffael 6/29/2016
凉!我相应地更新了答案。请随时将其标记为可接受的答案:)