2016-02-14 3 views
1

Как получить доступ к значению @ в целом?Как получить доступ к вложенному значению, которое начинается с @?

Это происходит от обратного вызова Rubykassa перл:

config.success_callback = ->(notification) { PaymentsController.new.on_payment_success(notification) } 

моему методу контроллера:

def on_payment_success(notification) 
    a = notification[:@invoice_id] 
    @payment = Payment.find_by_invoice_id(invoice_id.to_i) 
    @account = @payment.account 
    @payment.update_attribute(:status, 'paid') 
    Transaction.up_balance(@total, @account) 
    if @payment.user.price_plan.price == 0 
     redirect_to edit_user_registration_path, notice: '' 
    else 
     redirect_to groups_path, notice: '' 
    end 

    end 

UPDATE

Речь идет о синтаксисе. В случае регулярного хэша

notification: {invoice_id: '101', total: '500} 

я могу получить доступ значение invoice_id по notification[:invoice_id] но notification[:@invoice_id] не работает. Как получить стоимость?

enter image description here

+0

Можете ли вы дать какие-либо контекст? –

+0

@ RichardPeck добавлен. Я пробовал разные способы. Просто не могу понять, как получить доступ к нему из кода. – nobilik

+2

Если вы можете получить доступ к '@ invoice_id', тогда будет возможно получить доступ к' @ total' таким же образом. – sugaryourcoffee

ответ

1

В соответствии с экрана, @total является переменной экземпляра объекта Rubykassa. Вы не можете получить к нему доступ, используя синтаксис, похожий на хэш, поскольку это не Хэш.

Мое предположение подтверждается by the source code

module Rubykassa 
    class Notification 
    include SignatureGenerator 

    attr_accessor :params 

    def initialize(params) 
     @params = HashWithIndifferentAccess.new(params) 
     @invoice_id = @params["InvId"] 
     @total = @params["OutSum"] 
    end 

    %w(result success).map do |kind| 
     define_method "valid_#{kind}_signature?" do 
     @params["SignatureValue"].to_s.downcase == generate_signature_for(kind.to_sym) 
     end 
    end 

    def success 
     "OK#{@invoice_id}" 
    end 
    end 
end 

@total не кажется, публично подвергается классом, следовательно, не может быть предназначен для прямого доступа.

Рубин довольно разрешительный язык, следовательно, вы можете получить доступ к нему либо с помощью instance_variable_get или definiting пользовательского аксессору:

notification.instance_variable_get(:'@total') 

или

module Rubykassa 
    class Notification 
    attr_reader :total 
    end 
end 

notification.total 
Смежные вопросы