#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