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
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
¯ \\ _ (ツ) _/¯ 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
é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. –