【问题标题】:Reusing form_for in view for a mailer errors on forgery重用 form_for 以查看邮件程序伪造错误
【发布时间】:2011-03-22 19:51:15
【问题描述】:

我在模板 new.html.erb 中有一个 form_for,我在其中正常保存到数据库,然后发送一封成功的电子邮件。我希望邮件程序发送与正文相同的 new.html.erb 并传递模型,以便完全填充表单。我收到以下错误:

undefined method `protect_against_forgery?' for #<#<Class:0x000000049d7110>:0x000000049d4690>

紧跟在 form_for 标记之后(因为我认为它正在注入 auth 标记标记)。有没有办法可以规避这个问题,以便我可以在邮件程序中重复使用模板?

这是邮件程序代码的样子

class MaintenanceMailer < ActionMailer::Base
  helper :application  

  def request_email(maintenance)
    mail :to => maintenance.community.email, :subject => "Maintenance" do |format|
      format.html { render :layout => 'default', :template => 'maintenance/new' }
    end    
  end
end  

【问题讨论】:

    标签: ruby-on-rails-3 actionmailer actionview form-helpers


    【解决方案1】:

    你可以在template.new.html中关闭form_for的真实性来避免此类错误

    你可以检查一下 How do i remove the authenticity_token from rails forms

    【讨论】:

    • 我了解到您还没有资格发表评论。在 / 中发布链接作为答案时,请尝试总结链接可能详细说明的主要思想。
    【解决方案2】:

    我在房屋销售页面工作时遇到了同样的问题。您在电子邮件模板中使用 form_for 吗?因为这是我的麻烦,所以我使用 div 而不是 form_for 构建了它,并且一切正常。

    【讨论】:

      【解决方案3】:

      我使用了 Sam C 建议的方法,但稍作调整。就在将渲染调用为字符串之前,我重写了该方法。

      ApplicationHelper.send(:define_method, :protect_against_forgery?) { false }
      html = render_to_string(template: "quotations/show", layout: "application_print")
      

      这会覆盖protect_against_forgery?方法暂时。

      【讨论】:

        【解决方案4】:

        将此添加到只有您的邮件模板使用的帮助程序:

            def protect_against_forgery?
              false
            end
        

        但要确保接收控制器跳过 verify_authenticity_token,并且会话劫持对于该表单携带的任何内容都是可以的。

        【讨论】:

        • 我之前尝试过,但它给了我另一个错误:ActionController::InvalidAuthenticityToken 我希望该操作验证表单的正常页面请求的真实性。进入邮件程序后,是否需要向控制器发送一些东西?现在它所要做的就是渲染那个“新”模板而不返回控制器。
        • 是的,这是跳过“verify_authenticity_token”部分。在控制器中执行此操作的语法(在顶部)是:skip_before_filter :verify_authenticity_token, :only => [:my_form_action]
        猜你喜欢
        • 2018-10-22
        • 2021-05-01
        • 1970-01-01
        • 2021-10-16
        • 2018-06-28
        • 2019-05-15
        • 2021-04-06
        • 2021-05-07
        • 2020-03-01
        相关资源
        最近更新 更多