2017-05-20 1 views
2

Dans un magasin E, je construis. Le client peut acheter des articles et la transaction passe par braintree sans problèmes.L'application Rails n'envoie pas d'e-mails après avoir passé la commande et modifié l'état de la livraison, elle se décompose simplement

Mais lorsque le client passe sa commande ... les choses vont mal ... l'application se brise.

rails donne une page d'erreur "Nous sommes désolés, mais quelque chose s'est mal passé."

c'est le .log du serveur

I, [2017-05-19T22:23:10.127481 #22752] INFO -- : Completed 500 Internal Server Error in 2695ms (ActiveRecord: 7.7ms) 
F, [2017-05-19T22:23:10.129139 #22752] FATAL -- : 
Errno::ECONNREFUSED (Connection refused - connect(2) for nil port 587): 
    app/controllers/orders_controller.rb:35:in `create' 

et voici le order_controller.rb
la ligne 35 est OrderNotifier.received(@order).deliver

class OrdersController < ApplicationController 

include CurrentCart 
before_action :set_cart, only: [:new, :create] 
before_action :set_order, only: [:show, :edit, :destroy] 

def index 
    @orders = Order.all? 
end 

def new 
    @images = ["1.jpg", "2.jpg", "3.jpg", "4.jpg", "5.jpg"] 
@random_no = rand(5) 
@random_image = @images[@random_no] 

    if @cart.product_items.empty? 
     redirect_to root_url, notice: 'Your Cart is Empty' 
     return 

    end 
    @order = Order.new 
    @client_token = Braintree::ClientToken.generate 

    @del_cost_euro = 20 
end 

def create 
    @order = Order.new(order_params) 
    if @order.save 
     charge 
     if @result.success? 
      @order.add_product_items_from_cart(@cart) 
     Cart.destroy(session[:cart_id]) 
     session[:cart_id] = nil 
     OrderNotifier.received(@order).deliver #this is line 35 
     redirect_to root_url, notice: 'Thank You for Your Order' 
     else 
      flash[:error] = 'Please Check Your Cart' 
      redirect_to root_url, alert: @result.message 
      @order.destroy 
     end 
    else 
     @client_token = Braintree::ClientToken.generate 
     render :new 
    end 
end 


def show 

end 


def destroy 
    @order.destroy 
    redirect_to root_url, notice: 'Order deleted' 
end 

private 

def set_order 
    @order = Order.find(params[:id]) 
end 

def order_params 
    params.require(:order).permit(:name, :email, :address, :city, :country, :pick_up, :delivery) 
end 

def charge 
    @result = Braintree::Transaction.sale(
     amount: @cart.total_price_usd, 
     payment_method_nonce: params[:payment_method_nonce]) 
end 

end 

Pour le backend J'utilise activeadmin ... après la l'ordre est placé, je peux voir l'ordre dans le panneau de commande à l'extrémité arrière, mais quand je veux changer le shipped de false à true l'application casse à nouveau ...

le client est censé recevoir un mail de l'ordre d'être expédié .. mais il n'a jamais est envoyé

le error log dit

I, [2017-05-20T13:50:26.645335 #19043] INFO -- : Completed 500 Internal Server Error in 23ms (ActiveRecord: 2.6ms) 
F, [2017-05-20T13:50:26.646495 #19043] FATAL -- : 
Errno::ECONNREFUSED (Connection refused - connect(2) for nil port 587): 
    app/admin/order.rb:6:in `block (2 levels) in <top (required)>' 

Encore une fois la rupture a quelque chose à voir avec l'envoi de mails.

ici est le app/admin/order.rb

ActiveAdmin.register Order do 

    permit_params :shipped 

    after_update do |order| 
     OrderNotifier.shipped(@order).deliver if order.shipped # Again the error is happening in the OrderNotifier 

    end 

    show do |order| 

     panel 'Customer Details' do 
      attributes_table_for order, :name, :email, :address, :city, :country, :created_at 
     end 

     panel 'Created ' do 
      "#{time_ago_in_words order.created_at} ago" 
     end 


     panel 'Shipped ' do 
      order.shipped 
     end 

     panel 'Order Details' do 
      table_for(order.product_items) do 
       column 'Product' do |item| 
        item.product.title 
       end 
       column 'Quantity' do |item| 
        item.quantity 
       end 
       column 'Price Isl' do |item| 
        number_to_currency item.total_price_isl 
       end 
       column 'Price USD' do |item| 
        number_to_currency item.total_price_usd 
       end 
      end 
     end 

     panel 'Order Total USD' do 
      number_to_currency order.total_price_usd 

     end 

     panel 'Order Total Iskr' do 
      number_to_currency order.total_price_isl 

     end 

    end 


end 

Voici donc le app/mailers/order_notifier

class OrderNotifier < ApplicationMailer 

    default from: 'Hlín Reykdal Concept Store <[email protected]>' 

    def received(order) 
    @order = order 

    mail to: order.email, subject: 'Hlín Reykdal Concept Store' 
    end 


    def shipped(order) 
    @order = order 

    mail to: order.email, subject: 'Order Shipped' 
    end 
end 

est ici le app/config/environment/production.rb

Rails.application.configure do 
    config/application.rb.  
    config.cache_classes = true 
    config.eager_load = true 
    config.consider_all_requests_local  = false 
    config.action_controller.perform_caching = true 
    config.serve_static_files = ENV['RAILS_SERVE_STATIC_FILES'].present? 
    config.assets.js_compressor = :uglifier 

    config.assets.compile = true 

    config.assets.digest = true 
    config.assets.initialize_on_precompile = false 

    config.log_level = :debug 

    config.i18n.fallbacks = true 

    config.active_support.deprecation = :notify 

    config.log_formatter = ::Logger::Formatter.new 

    config.active_record.dump_schema_after_migration = false 

    config.action_mailer.default_url_options = { host: 'hlinreykdal.com'} 
    config.action_mailer.perform_deliveries = true 
    config.action_mailer.raise_delivery_errors = true 
    config.action_mailer.delivery_method = :smtp 
    config.action_mailer.smtp_settings = { 
    address: ENV["SMTP_ADDRESS"], 
    user_name: ENV["SMTP_USER"], 
    password: ENV["SMTP_PASSWORD"], 
    domain: "hlinreykdal.com", 
    port: 587, 
    authentication: :login, 
    enable_starttls_auto: true 
    } 

    Braintree::Configuration.environment = :production 
    Braintree::Configuration.merchant_id = ENV['merchant_id'] 
    Braintree::Configuration.public_key = ENV['public_key'] 
    Braintree::Configuration.private_key = ENV['private_key'] 

end 

Répondre

2

Port 587 est généralement réservé pour SMTP, vous êtes à droite: ceci est lié à l'email: ça sonne comme le co Le serveur SMTP configuré ne fonctionne pas et accepte les connexions. Résolvez cela et cette erreur devrait disparaître.

+0

Ok merci, puis-je installer quelque chose comme "Postfix" sur le VPS? Je pensais que tout était automatique, puisque le courrier est via google costumes – DaudiHell

+0

¯ \\ _ (ツ) _/¯ J'utilise un [service de livraison] (https://sendgrid.com/solutions/sendgrid-api/) pour tout . J'utilise aussi [Rails-as-a-service-platform-as-a-service] (http://heroku.com/). Bien plus facile que de perdre mon temps à piquer sur AWS. – coreyward

+1

également, utilisez 'delayed_job' ou un autre gem similaire pour envoyer des emails de manière asynchrone et éviter ces erreurs/exceptions soulevées affectant UX. –