The problem is that I can't show stripe errors on signup modal dialog.
Javascript:
$.externalScript('https://js.stripe.com/v1/').done(function(script, textStatus) {
Stripe.setPublishableKey($('meta[name="stripe-key"]').attr('content'));
var subscription = {
setupForm: function() {
return $('form').submit(function() {
$('input[type=submit]').prop('disabled', true);
if ($('#card_number').length) {
subscription.processCard();
return false;
} else {
return true;
}
});
},
processCard: function() {
var card;
card = {
name: $('#user_name').val(),
number: $('#card_number').val(),
cvc: $('#card_code').val(),
expMonth: $('#card_month').val(),
expYear: $('#card_year').val()
};
return Stripe.createToken(card, subscription.handleStripeResponse);
},
handleStripeResponse: function(status, response) {
if (status === 200) {
$('#stripe_token').val(response.id)
$('form')[0].submit()
} else {
$('#stripe_error').text(response.error.message).show();
return $('input[type=submit]').prop('disabled', false);
}
}
};
return subscription.setupForm();
});
In the same js file, I have this ajax call for devise's create method but I get null value for error all the time. So I guess this part below and the one above can't go together. I tried to merge them and do ajax call inside handleStripeResponse function above but then some other problems appeared.
$('.signup').click(function(e){
e.preventDefault();
$.ajax ({
url: '/users',
method: 'POST',
dataType: "JSON",
success: function(data) {
if (data.status == 'failed') {
$('#stripe_error').show().text(data.error_message);
return false;
}
}
});
});
Devise Registrations Controller:
def create
build_resource
user = User.new params[:user]
if user.save_with_payment
if user.active_for_authentication?
set_flash_message :notice, :signed_up if is_navigational_format?
sign_in(resource_name, user)
# respond_with resource, :location => after_sign_up_path_for(user)
render json: { status: 'success', resource: user }
else
set_flash_message :notice, :"signed_up_but_#{resource.inactive_message}" if is_navigational_format?
expire_session_data_after_sign_in!
respond_with user, :location => after_inactive_sign_up_path_for(user)
end
else
clean_up_passwords user
render json: { status: 'failed', error_message: user.save_with_payment }
end
end
User model:
def save_with_payment
if valid?
stripe_customer = Stripe::Customer.create(
:email => email,
:source => stripe_token
)
self.customer_id = stripe_customer.id
update_stripe_user_details
save!
end
rescue Stripe::InvalidRequestError => e
logger.error "Stripe error while creating customer: #{e.message}"
errors.add :base, "There was a problem with your credit card."
rescue Stripe::CardError => e
stripe_error e, e.message
errors.add :base, e.message
rescue Stripe::InvalidRequestError => e
stripe_error e, e.message
errors.add :base, e.message
rescue Stripe::AuthenticationError => e
stripe_error e, e.message
errors.add :base, e.message
rescue Stripe::APIConnectionError => e
stripe_error e, e.message
errors.add :base, e.message
rescue Stripe::StripeError => e
stripe_error e, e.message
errors.add :base, e.message
rescue => e
stripe_error e, e.message
errors.add :base, e.message
end
Please point me in the right direction, I am getting out of ideas.