Rails — отправка электронной почты при нажатии кнопки

#ruby-on-rails-4 #actionmailer

#ruby-on-rails-4 #actionmailer

Вопрос:

rails 4.1.1

У меня есть OrdersController, и в заказах отображаются действия, которые у меня есть…

orders_controller.rb

 def show
  @order = Order.find(params[:id])
  @client = Client.find(@order.client_id)

  if request.post?
    OrderMailer.order_send(@client, @order).deliver
    flash[:notice] = 'Order details sent!'
    redirect_to order_path(@order.id)
  end
end
  

Затем на представлении, которое у меня есть…

(show.haml)

 = button_to "Send", @order
  

Если я уберу «OrderMailer» из инструкции if и перейду на страницу показа / заказа, электронное письмо будет отправляться повторно, пока я не закрою сервер разработки, чтобы я знал, что часть почтовой программы отправляет / работает нормально.

Я просто не уверен, как связать нажатие кнопки / отправку электронной почты вместе? Мне нужен маршрут, но я не уверен, как связать его вместе, если у меня уже есть маршрут для страницы заказов / показа?

routes.rb

 resources :orders, :path => 'orders'
  

Ответ №1:

Я не уверен, как заставить ваш текущий метод работать, но есть несколько способов сделать это. Вот один из способов, который я использовал:

Настройте действие вашего контроллера:

 orders_controller.rb

def send_order_mail
  @parameters = Model.get_parameters
  OrderMailer.name_of_action(@parameters).deliver
  # redirect code here
end
  

Настройте свой маршрут:

 get send_order_mail, to: 'orders_controller#send_order_mail', as: :send_order_mail
  

Затем создайте свою ссылку.

 link_to 'Send mail', send_order_mail_path, class: "big-button"
  

Комментарии:

1. Спасибо за реплей @steel. Добавление этого маршрута выдает ошибку при запуске сервера разработки «неопределенная локальная переменная или метод `send_order_mail’ для #<ActionDispatch::Routing::Mapper:0x00000006472178> (ошибка имени)»?

2. Вы определили это в своем orders_controller?

3. Да, я это сделал. Теперь у меня есть маршрут как ‘get’orders /: id’, к: ‘orders_controller#send_order_mail’, как: :send_order_mail’, но нажатие на ссылку «Отправить» ничего не делает.

4. Я подозреваю, что в вашей реализации что-то идет не так. Рад взглянуть на суть или git вашего кода.

5. @polarcare используете ли вы ‘send_order_mail’ в представлении вашей кнопки вместо ‘send_order_mail_path’? Если это так, используйте ‘send_order_mail_path’, чтобы устранить проблему.

Ответ №2:

Хорошо, с помощью @steel вот код.

routes.rb (изменен старт на символ)

 get :send_order_mail, to: 'orders#send_order_mail', as: :send_order_mail
  

orders_controller.rb

 def send_order_mail
  @order = Order.find(params[:id])
  @client = Customer.find(@order.client_id)

  OrderMailer.order_send(@order, @client).deliver
  flash[:notice] = "Order has been sent."
  redirect_to order_path(@order.id)
end
  

на orders/show.html.erb есть ссылка.

 <%= link_to "Send Order by email", :controller => "orders", :action => "send_order_mail", :id => @order.id %>
  

почтовые программы/order_mailer.rb

 class OrderMailer < ActionMailer::Base

  add_template_helper(OrdersHelper)

  default from: "mail@example.com"

  def order_send(order, client)
    @order = order
    @client = client
    mail(to: "#{@client.email}", subject: "Your subject")
  end
end