2012-12-28 194 views
2

我试图生成一个人可以在电子邮件中点击的取消订阅链接。下面是我的路线是这样的:Rails匹配路由错误

match "/unsubscribe/:email/:token" => "mailing_list_recipients#destroy", :as => :unsubscribe 

当我运行rake routes,我得到:

unsubscribe GET /unsubscribe/:email/:token(.:format) mailing_list_recipients#destroy 

我甚至可以这样做:

unsubscribe_url(mailing_list_recipient.email, mailing_list_recipient.token) 

,输出:

http://localhost:3000/unsubscribe/[email protected]/f99e3af9bd959c6c8f3882a6e10e354e 

但是,当我尝试访问此URL时,我得到以下错误:

No route matches [GET] "/unsubscribe/[email protected]/6458f6a714d81a9cdd1cd1133dd65f0d" 

我错过了什么?

+2

你应该URL编码的电子邮件地址 – apneadiving

+0

你是对的@apneadiving。你可以发表你的评论作为答案? – LandonSchropp

+0

完成,谢谢:) – apneadiving

回答

2

由于改变评论说,你应该简单URL编码的电子邮件地址

+0

感谢您的帮助! – LandonSchropp

0

问题出在电子邮件地址为:[email protected]

您必须编写适配器。用另一个符号替换点,如“!” (如果你仍然想在URL字符串email):

代码可能是类似的东西:

# Recipient: 

def email_for_url 
    email.gsub(/\./,"!") 
end 

def self.search_by_email(url_email) 
    find_by_email(url_email.gsub(/\!/,".")) 
end 

所以,你可以使用:

unsubscribe_url(mailing_list_recipient.email_for_url, mailing_list_recipient.token) 

Recipient.search_by_email(params[:email]) 
+0

我觉得URL编码的电子邮件地址更容易一些,并保证它可以通过URL传递。 – LandonSchropp

+0

好吧,编码电子邮件本身就是在破坏这个想法 - 在URL中显示_recognizable_(通过人眼)电子邮件。否则,您可以使用任何其他ID。 –

0

您需要编码的电子邮件地址,你可以用任何方法做。

# ERB in your view 
<%=u unsubscribe_url(mailing_list_recipient.email, mailing_list_recipient.token) %> 

# Using Rack::Utils 
Rack::Utils.escape(unsubscribe_url(mailing_list_recipient.email, mailing_list_recipient.token)) 

# Using URI::escape 
URI::escape(unsubscribe_url(mailing_list_recipient.email, mailing_list_recipient.token)) 

这将您的网址从

http://localhost:3000/unsubscribe/[email protected]/f99e3af9bd959c6c8f3882a6e10e354e 

http://localhost:3000/unsubscribe/hello%40hello.com/f99e3af9bd959c6c8f3882a6e10e354e 
+0

它仍然提高:没有路线匹配。他必须逃避。 –