在Action Mailer View中删除模型资源链接

时间:2016-03-29 23:29:16

标签: ruby-on-rails

我在Action Mailer中生成链接时遇到了一些麻烦,该链接允许在单击时删除资源。这是我的删除方法的代码(在应用程序内部正常工作):

def destroy
    @registrant = Registrant.find(params[:id])
    @registrant.destroy
    flash[:danger] = "Your registration has successfully been cancelled."
    redirect_to root_url
    RegistrantMailer.cancellation_email(@registrant, @registrant.event).deliver_now
    rescue
      flash[:warning] = "No registration record found."
      redirect_to root_url
  end

以下是申请的路线:

Prefix Verb   URI Pattern                     Controller#Action
         registrants POST   /registrants(.:format)          registrants#create
          registrant GET    /registrants/:id(.:format)      registrants#show
                     DELETE /registrants/:id(.:format)      registrants#destroy
static_pages_contact GET    /static_pages/contact(.:format) static_pages#contact
  static_pages_about GET    /static_pages/about(.:format)   static_pages#about
              events GET    /events(.:format)               events#index
                     POST   /events(.:format)               events#create
           new_event GET    /events/new(.:format)           events#new
          edit_event GET    /events/:id/edit(.:format)      events#edit
               event GET    /events/:id(.:format)           events#show
                     PATCH  /events/:id(.:format)           events#update
                     PUT    /events/:id(.:format)           events#update
                     DELETE /events/:id(.:format)           events#destroy
                root GET    /                               static_pages#home

以下是我想在其中生成删除链接的邮件的链接:

<p>Can't make the event? Click here to cancel your registration: <%= link_to 'Destroy', @registrant, method: :delete %> </p>

1 个答案:

答案 0 :(得分:2)

从Rails视图中发出PUT和DELETE语句的能力是由于Rails为格式化链接和发出浏览器普遍理解的请求所做的额外工作。通常,浏览器只会在执行表单提交和请求文档时知道如何使用HTTP谓词GET和POST。 Rails允许通过发出POST请求来使用其他谓词,并通过提供HTTP标头来说明该请求应该被服务器解释为DELETE请求,例如。

当您在邮件程序视图中使用link_to帮助程序时,Rails用于转换和发出请求的其他javascript不存在,因此单击时链接将发送GET请求其他信息。

实际上有两种选择:

1:通过GET请求取消注册。 (这是最简单的方法,但不是首选方法,因为它允许任何人向此端点发出GET请求并删除注册。之前发生过这种情况,网页抓取工具发出GET请求以索引页面,并无意中删除了许多记录)。

2:将邮件程序视图中的链接指向Rails中的GET可访问登录页面。一旦用户在这里,登陆页面将有额外的指令,DELETE链接将起作用,因为浏览器再次访问Rails javascript助手。