2016-11-05 19 views
1

をエスケープを解除しました。出力は完全にエスケープされキープの@文字は、私は次のルートを持っている

user_path(@conn, :show, @current_user.user_name) 

::私はURLヘルパーを使用する場合しかし、

get "/@/:user_name", UserController, :show 

​​

私はこのようなルートを実装する場合@記号はエスケープされずに出力されます:

https://url.com/@/user

@記号のためにエスケープせずに最初のルートを実装する方法はありますか? URLパスの@記号を悪い考えですか?

+0

文字列に '/:username'とパターンマッチングだけを使ってみましたか?おそらくあなたのコントローラのような何か: 'def show(conn、%{" params "=>" @ "})'? – Sheharyar

答えて

2

その理由は、フェニックスヘルパーexpands segments and then encodes paramsです。 http://url.com/@userの最後のセグメントはパラメータであると見なされますが、http://url.com/@/userではありません。

正しい考え方であるかどうかについては異なる意見があるかもしれませんが、実際にはあなたのパラメータ(この特定のケースではユーザ名)は通常、外界から来ており、ルート自体はコードから来ています。だからhttp://url.com/@/userURI.encodeではありません。

私はフェニックスがそれを処理する方法と闘わず、単にhttp://url.com/@/userなどと行くでしょう。

OTOH、https://url.com/%40userおよびhttps://url.com/@userは、ブラウザの観点から全く同じで、同じ宛先につながります。

希望します。

+0

これは、私が考えていたことを確認するのに役立ちます。私は主に@記号(%40ではなく)を使用していましたので、審美的に気に入っているので、ユーザーは同じ形式を使用して別のユーザーのプロフィールを見ることができます。 – Mitkins

+0

私は、 user_path呼び出しを呼び出し、%40をURLパスのルートにある場合は@記号で置き換えます。これは、URLパスの@記号でルールを破らないと仮定します。 – Mitkins

+0

私の意見では、後処理するのは安全です。 – mudasobwa

関連する問題