2016-04-30 1 views
1

Я пытаюсь получить @user.stripe_customer_id, чтобы вернуть строку. Если он не установлен, он должен запустить вызов внешней службы, установить ее и вернуть.Rails: как установить атрибут, просто вызвав его

Более пространно здесь мои тесты:

context 'Stripe ID' do 
    it 'should not be writable' do 
    expect { @user.stripe_customer_id = 'random_id_123123' } 
     .to raise_error(NoMethodError) 
    end 

    it 'should be generated if it does not exist' do 
    @user.save 
    expect(@user.stripe_customer_id).to include('cus') 
    end 
end 

где @user является действующий User << ActiveRecord экземпляр.

Rspec терпит неудачу со следующим:

Failed examples: 

rspec ./spec/models/user_spec.rb:87 # User Stripe ID should be generated if it does not exist 

И файл User.rb имеет следующие строки:

def stripe_customer_id 
    if stripe_customer_id.blank? 
     stripe = Stripe::Customer.create(
     description: "Username: #{username}", 
     email: email 
    ) 
     self.stripe_customer_id = stripe.id 
     save! 
    end 
    stripe_customer_id 
    end 

    private 

    def stripe_customer_id=(new_customer_id) 
    write_attribute(:stripe_customer_id, new_customer_id) 
    end 

ответ

1

Вы пытаетесь перезаписать геттер для stripe_customer_id

def stripe_customer_id 
    self[:stripe_customer_id] || write_attribute(:stripe_customer_id, new_customer_id) 
end 

Это непроверенный код, который я только что написал. Но я уверен, что это должно сработать для вашего дела. Пожалуйста, дайте мне знать, дайте мне знать.

+0

Передано! Спасибо! – amingilani

+0

Мне любопытно, однако, почему моя версия не работала? – amingilani

+0

, вы определили метод 'stripe_customer_id =', который является методом setter, используется для установки значений и не получения их. :) – Alfie

Смежные вопросы