Techioz Blog

Ruby on Rails がメソッド内の定数を破損しているようです

概要

私の定数は変更されているようですが、どうすれば変更できますか。

環境はRails 7.0.7.2です rbenv経由のRuby 3.1.2p20

考慮する

module ArrayTestMethods
  PROFILE_PARAMS = [["id","id"],["customer_id","contactId"],["channelId","channelId"],["identifierId","identifierId"],["platform","platform"],["identifier","identifier"],["created","createdAt"],["updated","updatedAt"]].freeze

  def showme
    params = {"id"=>"d1", "contactId"=>"contact1", "channelId"=>"bbc2", "identifierId"=>"ident2", "platform"=>"events", "inheritedFrom"=>"", "createdAt"=>"2023-10-19T17:03:58Z", "updatedAt"=>"2023-10-19T17:03:58Z", "identifier"=>"353860872561"}
    x = model_from_hash(params, PROFILE_PARAMS)
    pp x

  end
  def json_walker(params, *args)
    args.each do | arg|
      params = params[arg]
      return nil if params.nil?
    end
    return params
  end
   def model_from_hash(params, array_map, debug = false)
    #im doing the below as a test i've tried
    # array = array_map.clone same result
    # i've also tried using array_map on its own
    array =  Array.new
    array << array_map
    attributes_array = array[0]

    puts "array map before"
    pp attributes_array
    attr_hash = Hash.new

    attributes_array.each do | arr|
      model_attribute = arr[0]
      arr.shift
      data = json_walker(params, *arr)
      puts "arr0 - #{model_attribute} data - #{data}" if debug
    end
    puts "array map after "
    pp array_map
    return array_map
  end
  module_function :json_walker, :model_from_hash, :showme

これを一度実行すると、ArrayTestMethods::showme が得られます。

2 回目に実行すると、次の結果が得られます

きっと結果はこうなるはず

解決策

arr.shift は配列を変更します。

したがって、各ブロック内の配列を変更する代わりに、元の配列を変更せずに、ある変数から別の変数に値を渡すことができます。

変えてみようと思います

attributes_array.each do | arr|
  model_attribute = arr[0]
  arr.shift
  data = json_walker(params, *arr)
  puts "arr0 - #{model_attribute} data - #{data}" if debug
end

attributes_array.each do | arr|
  model_attribute = arr[0]                # first element
  data = json_walker(params, arr[1..-1])  # elements from second position to the end
  puts "arr0 - #{model_attribute} data - #{data}" if debug
end