我在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>
答案 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助手。