1

Я модернизация моего рубина 2.3.1/Rails 4.2.5.1 к Rails 5.0.0.1 и я встречая странные ошибки при запуске контроллера спецификации для моего следующего контроллера:В действии контроллера `PARAMS = params.merge ({})` поднимает NoMethodError: неопределенный метод `слияние» для ноля: NilClass

в моем контроллере я следующий код:

class Api::InboundSmsCallbackController < ActionController::Base 
    include Api::SmsCallbackHelpers 
    include Api::ServiceErrorHelpers 

    # GET /inbound_sms_callback/alert_acknowledgement(.:format) 
    def alert_acknowledgement 

    .... 
    ... 

    params.merge!({ 
     acknowledger_user_id: acknowledger_user.id, 
     alert_id: alert.id, 
     acknowledgement_time: sms_sent_at 
    }) 

    begin 
     creation_service = AcknowledgementAlert::CreationService.new(params) 
    rescue ServiceError => se 
     render json: json_hash, status: status 
     return 
    end 

    .... 
    ... 

    render json: json_hash, status: 200 
    end 

end 

После обновления сверток использовать Rails 5, когда я побежал код контроллера. Я получил следующее предупреждение:

DEPRECATION WARNING: Method merge! is deprecated and will be removed in Rails 5.1, as ActionController::Parameters no longer inherits from hash. Using this deprecated behavior exposes potential security problems. If you continue to use this method you may be creating a security vulnerability in your app that can be exploited. Instead, consider using one of these documented methods which are not deprecated: http://api.rubyonrails.org/v5.0.0.1/classes/ActionController/Parameters.html

Чтобы исправить это я изменил

params.merge!({ 
     acknowledger_user_id: acknowledger_user.id, 
     alert_id: alert.id, 
     acknowledgement_time: sms_sent_at 
    }) 

К

params = params.merge({ 
     acknowledger_user_id: acknowledger_user.id, 
     alert_id: alert.id, 
     acknowledgement_time: sms_sent_at 
    }) 

и я передаю в Params в своем классе услуги в следующем порядке:

creation_service = AcknowledgementAlert::CreationService.new(params.to_unsafe_h) 

Но с этим измените, когда я запустил пример спецификации, который он с ошибкой говорит

NoMethodError: 
    undefined method `merge' for nil:NilClass 

и трассировки ошибок указывает на строку, в которой я сделал изменения:

params = params.merge({ 
     acknowledger_user_id: acknowledger_user.id, 
     alert_id: alert.id, 
     acknowledgement_time: sms_sent_at 
    }) 

Это очень странно, потому что я пытался печатать params до того, что заявление оценивается, и я получаю объект распечатана:

>>>>>>>>>>>. params: <ActionController::Parameters {"message-timestamp"=>"2016-10-06 12:35:15 UTC", "msisdn"=>"919845128956", "text"=>"S3e9a6cE", "to"=>"12547836910", "controller"=>"api/inbound_sms_callback", "action"=>"alert_acknowledgement"} permitted: false> 

Тогда почему применение merge на params жалуется на ноль: NilClass.

Я попытался изменить свой обновленный код

ackn_params = params.merge({ 
     acknowledger_user_id: acknowledger_user.id, 
     alert_id: alert.id, 
     acknowledgement_time: sms_sent_at 
    }) 

    creation_service = AcknowledgementAlert::CreationService.new(ackn_params.to_unsafe_h) 

и она будет выполнена и моя спецификация пример проходит.

Я не понимаю, почему тогда params = params.merge не работает.

Есть ли у кого-нибудь идеи о том, что вызывает это странное поведение?

Другое дело, я попытался это:

params = params 

ackn_params = params.merge({ 
    acknowledger_user_id: acknowledger_user.id, 
    alert_id: alert.id, 
    acknowledgement_time: sms_sent_at 
}) 

Теперь, когда не удается с той же ошибкой

undefined method `merge' for nil:NilClass 

Так выглядит переназначения к params является основной причиной позади этого. Если это звучит правильно, то есть какая-либо конкретная причина, почему params не может быть переназначены, потому что documentation из ActionController::Parameters#merge(other_hash) метода говорит

Returns a new ActionController::Parameters with all keys from other_hash merges into current hash. 

Спасибо.

ответ

0

Я думаю, это должно помочь вам:

params = params.permit(:values, :from, :params).to_h.merge({ 
     acknowledger_user_id: acknowledger_user.id, 
     alert_id: alert.id, 
     acknowledgement_time: sms_sent_at 
}) 
+0

Спасибо. Меня больше волнует, почему 'params = params.merge' жалуется на то, что params являются' nil', когда оценивается 'params.merge'. Это действительно озадачивает. –

+0

@JiggneshhGohel –