Rails - 单击按钮发送电子邮件

pol*_*are 2 actionmailer ruby-on-rails-4

导轨 4.1.1

我有一个 OrdersController,在订单上显示我有的操作......

订单控制器.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
Run Code Online (Sandbox Code Playgroud)

然后我的观点是...

(显示.haml)

= button_to "Send", @order
Run Code Online (Sandbox Code Playgroud)

如果我从 if 语句中取出“OrderMailer”并访问显示/订单页面,则电子邮件会重复发送,直到我关闭开发服务器,这样我就知道邮件程序部分发送/工作正常。

我只是不确定如何将按钮点击/发送电子邮件绑定在一起?我需要一条路线,但如果我已经有订单/显示页面的路线,则不确定如何将其绑定在一起?

路线.rb

resources :orders, :path => 'orders'
Run Code Online (Sandbox Code Playgroud)

ste*_*eel 5

我不确定如何使您当前的方法发挥作用,但有多种方法可以做到这一点。这是我使用过的一种方法:

设置您的控制器操作:

orders_controller.rb

def send_order_mail
  @parameters = Model.get_parameters
  OrderMailer.name_of_action(@parameters).deliver
  # redirect code here
end
Run Code Online (Sandbox Code Playgroud)

设置您的路线:

get send_order_mail, to: 'orders_controller#send_order_mail', as: :send_order_mail
Run Code Online (Sandbox Code Playgroud)

然后建立你的链接。

link_to 'Send mail', send_order_mail_path, class: "big-button"
Run Code Online (Sandbox Code Playgroud)


pol*_*are 5

好的,在@steel 的帮助下,这里是代码。

routes.rb(将开始更改为符号)

get :send_order_mail, to: 'orders#send_order_mail', as: :send_order_mail
Run Code Online (Sandbox Code Playgroud)

订单控制器.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
Run Code Online (Sandbox Code Playgroud)

orders/show.html.erb 上有链接。

<%= link_to "Send Order by email", :controller => "orders", :action => "send_order_mail", :id => @order.id %>
Run Code Online (Sandbox Code Playgroud)

邮件/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
Run Code Online (Sandbox Code Playgroud)