Преобразование параметров функции в объект Hash в Ruby on Rails
Я должен внести изменения в API, разработанный в Ruby On Rails, который выглядит следующим образом:
class V0::PythonsController < ApplicationController
skip_before_action :authorize_request
# POST v0/python/import
def import
result = { status: :error }
data = eval(AwsTool.decrypt(params["code"])).first
if data.class == Hash
user = User.find_by(id: data[:ot_user_id])
activity_type = ActivityType.find_by(id: data[:activity_type])
if user.nil?
result[:msg] = "user not found"
elsif activity_type.nil?
result[:msg] = "activity type not found"
else...
Я передаю ему некоторые данные в параметре "code", которые затем расшифровываются, а затем исследуются. Я хочу добавить условие if, чтобы при вызове API из другого источника не выполнялось шифрование и дешифрование. Итак, я сделал это изменение:
class V0::PythonsController < ApplicationController
skip_before_action :authorize_request
# POST v0/python/import
def import
result = { status: :error }
if params["origin"] != 'trusted'
data = eval(AwsTool.decrypt(params["code"])).first
else
data = params["code"]
end
if data.class == Hash
user = User.find_by(id: data[:ot_user_id])
activity_type = ActivityType.find_by(id: data[:activity_type])
...
Проблема в том, что data.class - это не объект Hash, а String. Я пробовал разные решения для преобразования объекта из String в Hash, такие как t_hash и другие подобные функции, но они не работали. Я получил некоторые ошибки о том, что параметры не разрешены, я попытался добавить разрешение к ним, но все равно не получилось.
Любая другая идея?
1 ответ
Это сбой, потому что вы забыли позвонить eval
на коде. Сделай это:
data = eval(params["code"])
Кстати, оценивать ввод очень опасно. Я надеюсь, что вы доверяете тому, кто использует этот API.