2012-12-28 191 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

它仍然提高:沒有路線匹配。他必須逃避。 –