2

人がメールでクリックできる購読解除リンクを生成しようとしています。私のルートは次のようになります。

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/hello@hello.com/f99e3af9bd959c6c8f3882a6e10e354e

ただし、この URL にアクセスしようとすると、次のエラーが表示されます。

No route matches [GET] "/unsubscribe/schroppl@gmail.com/6458f6a714d81a9cdd1cd1133dd65f0d"

私は何が欠けていますか?

4

3 に答える 3

2

コメントで述べたように、メールアドレスを単純にURLエンコードする必要があります

于 2012-12-30T22:48:01.520 に答える
0

問題は、メールアドレスのにあります: schroppl@gmail.com.

アダプターを作成する必要があります。ポイントを「!」などの別の記号に置き換えます。(URL文字列にメールが必要な場合):

コードは次のようになります。

# 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])
于 2012-12-29T03:50:06.457 に答える
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))

これにより、URLが次のように変更されます

http://localhost:3000/unsubscribe/hello@hello.com/f99e3af9bd959c6c8f3882a6e10e354e

http://localhost:3000/unsubscribe/hello%40hello.com/f99e3af9bd959c6c8f3882a6e10e354e
于 2012-12-30T18:36:12.113 に答える