In daily development the parameters passed to the action in the Controller when implementing business logic will be placed in the params object. generally we can access with
params[:token] #=> token_value
#or
params["token"] #=> token_value
You will find that the value of key in params can be access by using Symbol or String.
Is it a bit magical?
In fact the principle is very simple params have the characteristics extend from HashWithIndifferentAccess
class HashWithIndifferentAccess < Hash
#......
def []=(key, value)
regular_writer(convert_key(key), convert_value(value, for: :assignment))
end
# key point
def convert_key(key)
key.kind_of?(Symbol) ? key.to_s : key
end
def self.[](*args)
new.merge!(Hash[*args])
end
end
Through the above source code analysis, it can be seen that for a HashWithIndifferentAccess object, when assigning it key is uniformly converted into String type (covert_key method).
When a value is to be taken, the key of the Symbol will be forced to be converted to String so that the user can use Symbol ** or **String to take the same value.
Hope it can hlep you :)

Top comments (0)