質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.31%
Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Q&A

解決済

1回答

1501閲覧

CGI.escapeについて

ItiroWakuda

総合スコア9

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

0グッド

1クリップ

投稿2020/01/26 22:09

Rails tutorial 11.2.3や12.2.2の演習でCGI.escapeを削除するとテスト結果がredであることを確認するとありますが、greenのままとなります。

CGI.escapeは文字列を暗号化するためのメソッドであると認識していますが、これがgreenのままだとどのような問題があるのかよくわかりません。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

演習でCGI.escapeを削除するとテスト結果がredであることを確認するとありますが、greenのまま

ですが、11.2.3 送信メールのテスト - Ruby on Rails チュートリアルの演習で記述されている「CGI.escapeの部分を削除する」とは、
assert_match CGI.escape(user.email), mail.body.encoded の部分を「CGI.escapeの呼び出しを削除して、assert_match user.email, mail.body.encoded のように修正する」と言う意味ではないでしょうか。これだとassert_matchは失敗し、演習の答え通りREDになるはずです。

CGI.escapeは文字列を暗号化するためのメソッドであると認識していますが、これがgreenのままだとどのような問題があるのかよくわかりません。

言葉の使い方だけの問題ですが、CGI.escapeは暗号化をするものではありません。暗号化とは、簡単に書くと「ある者しか知らないキーやルールを用いて、そのキーやルールを知らない者以外はデータを復元できないようにする。」ことです。(逆は「復号化」です)CGI.escapeは、CGIと言うインターフェース仕様に適合するようにCGIの仕様に沿って文字列を変換するだけなので、暗号化とは言いません。Rubyでも例えば2重引用符"を文字列中に含める場合、\"にエスケープする、などと言いますよね。そんな用法のCGI版だと思えば良いです。

では「greenのままだとどのような問題があるのか。」ですが、この場合は「チュートリアルの手順を正しく進めていない。その時点で理解すべきことが欠けているかもしれない。」ことを示します。まず、CGI.escapeは引数の文字列をCGI用にエスケープした文字列を返します。チュートリアルのコードは以下ですが、

ruby

1# https://railstutorial.jp/chapters/account_activation?version=5.1#sec-email_tests より 2 3require 'test_helper' 4 5class UserMailerTest < ActionMailer::TestCase 6 7 test "account_activation" do 8 user = users(:michael) 9 user.activation_token = User.new_token 10 mail = UserMailer.account_activation(user) 11...省略 12 assert_match CGI.escape(user.email), mail.body.encoded 13 end 14end

ここで assert_match CGI.escape(user.email), mail.body.encoded とあるように、user.emailをCGIエスケープした結果がmail.body.encoded の文字列と同じであることを主張(assert)します。同じであればOKで、パスします。つまり「user.emailCGI.escapeすることであらかじめエスケープ(されているはずの)mail.body.encodedと同じになる」ことを確認できます。この行をassert_match user.email, mail.body.encoded と修正すると、user.emailはエスケープしないままmail.body.encoded と比較されるのでassert_matchは失敗します。したがってテスト結果がREDになるはずです。このテストがGREENである場合、コードの修正が間違っていたり、これまでの理解が足りていないかもしれないことを示しているので、演習の目的を達していないことになります。つまり、問題がある、と言うことです。

投稿2020/01/27 02:55

編集2020/01/27 03:14
dodox86

総合スコア9369

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ItiroWakuda

2020/01/27 13:19

ご指摘の通りするとredになりました。 コードの意味を理解せずに漫然とやってしまいました。丁寧な説明大変ありがとうございます。 検索するとエンコードというワードが出てきたため、暗号化なのかと思っていました。今一度エスケープの意味について調べ直してみようと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.31%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問