zlw i Lypa dzięki chłopaki za uwagi wezmę je do serca
Wrzuć gdzieś pełen backtrace i kod jak to robisz, to coś postaram się poradzić.
Kod w moim pliku spree_application.html.erb wyglada tak:
<div id="footer_right">
<%= render :partial => 'spree/shared/newsletter_subscribe_form' %>
<div id="footer_info">
<div id="footer_dane">
<div id="footer_pay">
Natomiast w pliku views / spree / shared / _newsletter_subscribe_form.html.erb
[code]
<%= form_for :user, :url => :subscriptions do |f| %>
<%= text_field_tag :email, t(‘enter_your_email’), :class => ‘email’, :id => ‘subscribe_email’ %> |
<%= submit_tag t(‘subscribe’), :id => ‘op_subscribe’ %> |
<% end -%>
def hominid
@hominid ||= Hominid::Base.new({ :api_key => Spree::Config.get(:mailchimp_api_key) })
end
def create
@errors = []
if params[:email].blank?
@errors << t('missing_email')
elsif params[:email] !~ /[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}/i
@errors << t('invalid_email_address')
else
begin
self.class.benchmark "Checking if address exists and/or is valid" do
@mc_member = hominid.member_info(Spree::Config.get(:mailchimp_list_id), params[:email])
end
rescue Hominid::ListError => e
end
if @mc_member
@errors << t('that_address_is_already_subscribed')
else
begin
self.class.benchmark "Adding mailchimp subscriber" do
hominid.subscribe(Spree::Config.get(:mailchimp_list_id), params[:email], {}, MailChimpSync::Sync::mc_subscription_opts)
end
rescue Hominid::ValidationError => e
@errors << t('invalid_email_address')
end
end
end
respond_to do |wants|
wants.js
end
end
end[/code]
A gdy wpisuję tu :
Wyrzuca mi to:
Zapomniałem dodać mam spree 1.1.3 dotego Mail Chimp mam nadany API Key i List ID
Spróbuj jakiś bardziej generyczny error tam łapać zamiast Hominid::ListError (w subscriptions_controller.rb:19)
? Nie rozumiem ocb…
Próbujesz tam złapać:
rescue Hominid::ListError => e
A ja miałem na myśli, byś złapał tam jakiś inny (wyżej w hierarchii klas) wyjątek.
Wiem, z czego korzystasz
Podałem Ci linijkę i co możesz spróbować zmienić, nie rozumiem czego nie rozumiesz
No właśnie dalej nie wiem co mam zmienić jaki wyżej wyjątek. Ta część linijki kodu którą podałeś jest identyczna z kodem błędu.
Dla mnie łopatologicznie proszę
Ok, łopatologicznie:
Hominid::ListError po czymś dziedziczy (nadrzędny error), więc złap (rescue) ten nadrzędny error w tej linijce zamiast tego, który aktualnie łapiesz.
doczytaj o wyjątkach w Rubym, jak je obsługiwać, jaka jest hierarchia itd. - http://rubylearning.com/satishtalim/ruby_exceptions.html
Może Tobie to oczywiste, dla mnie nie bardzo … Możesz przytoczyć jakiś przykładowy fragment kodu abym prezentujący tę zależność? Abym wiedział dokładnie czego szukać.
Dziękuję za zwrócenie mi uwagi na podstawy poprawiłem kod:
było:
begin
self.class.benchmark "Checking if address exists and/or is valid" do
@mc_member = hominid.member_info(Spree::Config.get(:mailchimp_list_id), params[:email])
end
rescue Hominid::ListError => e
end
a jest :
begin
self.class.benchmark "Checking if address exists and/or is valid" do
@mc_member = hominid.member_info(Spree::Config.get(:mailchimp_list_id), params[:email])
end
rescue Hominid::APIError => e
end
kod poszedł dalej al teraz wyrzuca mi błąd
undefined method `benchmark' for Spree::SubscriptionsController:Class
No to wywal benchmarka (a zostaw tworzenie mc_membera).
Zrobione dzięki wielkie…
Teraz wyrzuca błąd
Your Mailchimp API key appears to be malformed.
A kod wygenerowałem u nich na stronie… ach jak nie urok to…
po co Ci tam w ogóle ten benchmark? no i ten kod… z nim coś trzeba zrobić, kontroler tak nie może wyglądać…
wrzuć to gdzieś do modeli:
[code=ruby]class Subscription < Struct.new(:email)
include ActiveModel::Validations
validates :email, presence: true, format: /[A-Z0-9._%±]+@[A-Z0-9.-]+.[A-Z]{2,4}/i
validate :not_already_subscribed?
def subscribe!
if valid?
begin
hominid.subscribe(mailchimp_api_key, email, {}, MailChimpSync::Sync::mc_subscription_opts)
true
rescue Hominid::ValidationError => e
Rails.logger.debug(“Hominid exception: #{e.inspect}”)
false
end
end
end
def not_already_subscribed?
begin
hominid.member_info(mailchimp_list_id, email)
true
rescue Hominid::ListError => e
Rails.logger.debug(“Hominid exception: #{e.inspect}”)
false
end
end
private
def hominid
@hominid ||= Hominid::Base.new(api_key: mailchimp_api_key)
end
def mailchimp_api_key
Spree::Config.get(:mailchimp_api_key)
end
def mailchimp_list_id
Spree::Config.get(:mailchimp_list_id)
end
end[/code]
i w kontrolerze:
[code=ruby]def create
@subscription = Subscription.new(params[:email])
unless @subscription.subscribe!
@errors = @subscription.errors
end
respond_to do |format|
format.js
end
end[/code]
(pisane z głowy, więc gdzieś może być jakiś babol ;))