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.
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…
Thanks, but it seems it didn’t worked also because the value there’s. I’m on the verge of collapse.