Insane Rails problem

#1

Hi,
I’ve a problem

message = params[:message].to_unsafe_h
  logger.debug message[:text] # returns the text message correctly
  if message[:chat][:type] == ‘group’ || message[:chat][:type] == ‘supergroup’
      if message[:text] =~ /asd/i # NO METHOD ERROR, UNDEFINED METHOD [] FOR NIL:NilClass

Are you kidding me?

Any of you have any ideas?

This is insane
My application was API-only, I modified it to work with assets and make it a normal rails app and now there’s this problem
I’ve spent an hour trying to figure WHY and I didn’t understand

D, [2019-08-11T15:39:14.952504 #13713] DEBUG -- : [56fbc12a-ad66-46d6-956d-94870d3ca0ec] NOW MESSAGE
D, [2019-08-11T15:39:14.955103 #13713] DEBUG -- : [56fbc12a-ad66-46d6-956d-94870d3ca0ec] --- !ruby/hash:ActiveSupport::HashWithIndifferentAccess
update_id: 200421708
edited_message: !ruby/hash:ActiveSupport::HashWithIndifferentAccess
message_id: 37769
from: !ruby/hash:ActiveSupport::HashWithIndifferentAccess
  id: 85039287
  is_bot: false
  first_name: Dennis
  last_name: Radaelli
  username: Radden
chat: !ruby/hash:ActiveSupport::HashWithIndifferentAccess
  id: -1001447558052
  title: WIKINETWORK OT - FERDINANDO PADANIA VI FANNO IMPAZZIRE
  type: supergroup
date: 1565477411
edit_date: 1565477416
text: Vada! Vada!

Thanks for the help.

#2

I am not into Rails. Generally when you are calling the [key_object] method on a hash, it returns the value referring to the key_object.
But when it can’t find the key, it returns the default value. So as far as I understood, something like this is happening:

> hash = {a: {x: 1}, b: {y: 2}, c: {z: 3}}
=> {:a=>{:x=>1}, :b=>{:y=>2}, :c=>{:z=>3}}

> hash[:a][:x]
=> 1

> hash.dig(:a, :x)
=> 1

> hash[:d][:y]    # There's no :d key in the hash
Traceback (most recent call last):
        2: from /home/sourav/.irb:350:in `<main>'
        1: from (irb):15
NoMethodError (undefined method `[]' for nil:NilClass)
irb(main):016:0> hash[:d].to_h[:y]
=> nil

To avoid that, you can either:

> hash = {a: {x: 1}, b: {y: 2}, c: {z: 3}}
=> {:a=>{:x=>1}, :b=>{:y=>2}, :c=>{:z=>3}}

irb(main):018:0> hash[:d].to_h[:y]
=> nil

Or:

> hash = {a: {x: 1}, b: {y: 2}, c: {z: 3}}
=> {:a=>{:x=>1}, :b=>{:y=>2}, :c=>{:z=>3}}

> hash.default = {}
=> {}

> hash[:d][:y]
=> nil

Or:

> hash = {a: {x: 1}, b: {y: 2}, c: {z: 3}}
=> {:a=>{:x=>1}, :b=>{:y=>2}, :c=>{:z=>3}}

> hash.fetch(:d){ {} }[:y]
=> nil

But in your case, you may try to_h method on the message variable so it will force convert it to a hash if it’s nil or even if it’s a hash. The to_h method will create a new hash and GC will discard it when your job is done…

Sorry this was just an attempt. Any other RoR professional would guide you better…

#3

Thanks, but it seems it didn’t worked :frowning: also because the value there’s. I’m on the verge of collapse.