提问人:user2968505 提问时间:6/28/2016 更新时间:6/29/2016 访问量:731
Ruby 如何修改参数
Ruby how to modify parameters
问:
所以我有这个代码,我的目标是将任何空字符串转换为空
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 的新手,我发现它按值而不是按引用发送参数,因此没有更改参数,我该如何解决这个问题?
答:
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_null
convert_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
凉!我相应地更新了答案。请随时将其标记为可接受的答案:)
评论
all?
map
param.map{ |k,v| [x,y] }.to_h