Отправка письма с ошибкой Rails 3 - PullRequest
1 голос
/ 22 мая 2011

Я учусь отправлять электронную почту с помощью Rails 3 с помощью Agile Web Development Book, Задание H .Тем не менее, я получаю следующее сообщение об ошибке:

ArgumentError in OrdersController#create

wrong number of arguments (1 for 0)
Rails.root: /Applications/XAMPP/xamppfiles/htdocs/rails_projects/TUTORIALS/depot

Application Trace | Framework Trace | Full Trace
app/mailers/notifier.rb:4:in `order_received'
app/controllers/orders_controller.rb:57:in `block in create'
app/controllers/orders_controller.rb:52:in `create'

Я смотрел аналогичные обсуждения конфигурации gmail, , используя setup_mail.rb здесь и там, но не удалось удалить ошибку.

В моем файле config / environment.rb (потому что я хочу то же самое для dev / test / production) есть мои данные gmail с xxxx и yyyyy:

 Depot::Application.configure do
  config.action_mailer.delivery_method = :smtp
  config.action_mailer.smtp_settings = {
    :address => "smtp.gmail.com",
    :port => 587,
    :domain => "gmail.com",
    :authentication => "plain",
    :user_name => "xxxxxx@gmail.com",
    :password => "yyyyyyy",
    :enable_starttls_auto => true
}
end

model / notifier / order_received.text.erb имеет это:

Dear <%= @order.name %>
Thank you for your recent order from The Pragmatic Store.
You ordered the following items:
<%= render @order.line_items %>
We'll send you a separate e-mail when your order ships.

и, наконец, models / controller / orders_controller имеет метод def create с уведомлением строки:

def create 
   @order = Order.new(params[:order]) 
   @order.add_line_items_from_cart(current_cart) 
   respond_to do |format| 
      if @order.save Cart.destroy(session[:cart_id]) 
          session[:cart_id] = nil 
          Notifier.order_received(@order).deliver 
          format.html { redirect_to(store_url, :notice => 'Thank you for your order.') }
      else 
          format.html { render :action => "new" } 
          format.xml { render :xml => @order.errors, :status => :unprocessable_entity }
      end 
   end 
end

Мне кажется, что моя конфигурация электронной почты была выполнена неправильно, но я не уверен, какая именно.Спасибо!

РЕДАКТИРОВАТЬ : мне удалось решить это!Вместо smtp я использовал sendmail.Что касается ошибки количества аргументов, app / mailers / notifer.rb выглядит следующим образом:

class Notifier < ActionMailer::Base
  default :from => 'Sam Ruby <depot@example.com>'

  def order_received(order)
    @order = order
    mail :to => order.email, :subject => 'Pragmatic Store Order Confirmation'
  end

  def order_shipped(order)
    @order = order
    mail :to => order.email, :subject => 'Pragmatic Store Order Shipped'
  end
end

Хотя мои письма и все по-прежнему работает, мне интересно, кто-нибудь знает, почему SMTP неработает, а sendmail делает.

Ответы [ 2 ]

2 голосов
/ 22 мая 2011

В вашем order_received определении есть пробел:

def order_received (order)

Это должно быть так:

def order_received(order)
1 голос
/ 23 мая 2011

Это строка в create?

if @order.save Cart.destroy(session[:cart_id])

Если это действительно то, что у вас есть, то Ruby попытается передать в качестве аргумента все, что Cart.destroy возвращает @order.save, приведенное выше эквивалентнона это:

if(@order.save(Cart.destroy(session[:cart_id])))

Однако, метод save не принимает никаких аргументов, поэтому вы получаете «неправильное количество аргументов (1 для 0) в OrdersController # create»сообщение об ошибке.Я предполагаю, что вы имеете в виду:

if @order.save
  Cart.destroy(session[:cart_id])
  # etc.
...