Spree wykonanie i instalacja własnego modułu

zlw i Lypa dzięki chłopaki za uwagi wezmę je do serca :slight_smile:

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 -%>
[/code] a w pliku app / controllers / spree / subscriptions_controller.rb [code]class Spree::SubscriptionsController < Spree::BaseController

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 :frowning: 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.

https://github.com/sbeam/spree-mail-chimp z tego korzystam

Wiem, z czego korzystasz :slight_smile:
Podałem Ci linijkę i co możesz spróbować zmienić, nie rozumiem czego nie rozumiesz :slight_smile:

No właśnie dalej nie wiem co mam zmienić :frowning: jaki wyżej wyjątek. Ta część linijki kodu którą podałeś jest identyczna z kodem błędu.
Dla mnie łopatologicznie proszę :slight_smile:

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 ;))