2015-07-12 134 views
1

我一直在努力实现从这个问题的代码:Send an email manually of a specific page in rails app手动发送电子邮件的Rails

唯一的区别是,我需要从我的模型获取电子邮件地址。从模型发送电子邮件时通常没有问题。

UserMailer.report(self).deliver 

但我想单击我的记录的显示视图中的按钮。

我需要使用电子邮件中记录的详细信息手动发送电子邮件。

也许有比使用额外控制器更好的方法吗?

# app/mailers/user_mailer.rb 
class UserMailer < ActionMailer 
    def report(thing) 
    @thing = thing 
    mail :to => thing.email, :from => '[email protected]', 
     :subject => 'that report you want' 
    end 
end 

# app/views/user_mailer/report.html.erb 
<h1>Report</h1> 
<p>Here is your <% @thing.customer_id %></p> 


# app/controllers/reports_controller.rb 
def create 
    UserMailer.report(@thing).deliver 
    flash[:notice] = 'report sent!' 
    redirect_to root_path # or wherever 
end 

# in a view 
<% form_tag(reports_path(@thing), :method => :post) do %> 
    <% submit_tag 'send report email' %> 
<% end %> 

我返回null与上面的代码:

ArgumentError (wrong number of arguments (0 for 1)): 
app/controllers/reports_controller.rb:3:in `create' 

回答

0

创建是在轨道POST请求,你不能传递参数,这样,你需要从PARAMS获取。我看到你给它一个错误的参数。

其次,你正在做@thing =的事情,然后你正在发送的东西(无@)报告方法的UserMailer这也是错误的,这将是无报告方法。你应该在@thing是一个具有电子邮件的对象后执行UserMailer.report(@thing).deliver

+0

如何从params中获取? –

+0

所以当创建动作被调用时,这意味着某些表单正在从视图中提交,并且正在创建的东西以及您可以在创建动作中使用p参数创建的表单参数。所以在def create的下一行中执行p params。你会在Rails服务器日志中看到报告的参数。然后创建@report = Report.new(params [:report]); report.save。如果电子邮件存在于报告对象中,请执行此操作。UserMailer.report(@report).deliver – Athar

+0

请参阅第4点参数以了解操作及其工作方式。我认为它会帮助你http://guides.rubyonrails.org/action_controller_overview.html – Athar