2016-06-28 85 views
1

,所以我有這樣的代碼,而我的目標是任何空字符串轉換爲null紅寶石如何修改參數

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的,我發現它,它通過發送PARAMS價值,而不是通過引用,所以沒有變化的參數,我如何解決這個問題?

+0

注意'呢?'不替代任何東西。改用'map'。在散列的情況下,使用'param.map {| k,v | [x,y]} .to_h'。 – Raffael

回答

3

我認爲由「空」你的意思是零用繩子,這意味着僅由空白的字符串應該原封不動。 (否則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

這將解決這個問題,但顯然運算符'='沒有爲params定義,是否有一種方法來迭代params並更改元素本身而不創建新對象? – user2968505

+0

有兩種方法:(1)將返回的修改過的參數哈希存儲在新的實例變量中並使用它們。 (2)是的,知道'request.params'總是一個散列,我們可以在原地修改它的值。我應該詳細說明嗎? – Raffael

+0

謝謝我通過調用request.params的第一級遞歸調用來解決它的每個值 – user2968505

3

首先,這是你的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 

希望它可以幫助:)

+0

很好的答案bro – nik