現在、リンク付きのEメール招待状を送信する招待モデルを構築中です。リンクはsha1ハッシュで '保護されています'。ただし、コントローラはハッシュを検証するために失敗し、私はRails文字列の比較が16進文字列で失敗する
生成されたリンクは
/projects/1/invitations/12?hash=c043b70c359a85e20cd9933c9cd37ef3f8943d7b
のように見える...理由を把握することはできませんし、コントローラは、それらを検証しようとし
def show
@invitation = Invitation.find(params[:id])
if @invitation.hash.to_s != params[:hash].to_s
redirect_to root_url
....
文字列の比較は毎回失敗します。私はトリプルチェックしましたが、文字列は完全に同じようです。
EDIT:いくつかのデバッグ情報development.logで次の出力で
logger.debug params
logger.debug @invitation.hash
結果
{"hash"=>"c043b70c359a85e20cd9933c9cd37ef3f8943d7b", "action"=>"show",
controller"=>"invitations", "project_id"=>"1", "id"=>"12"}
c043b70c359a85e20cd9933c9cd37ef3f8943d7b
私はその答えについてはわかりませんが、私は最近、同様の招待システムを実装しました。私は次のチュートリアルを私のニーズに合わせて修正しました。 http://railscasts.com/episodes/124-beta-invitations – Karan
比較が失敗した場合の例を教えてください。 @ invitation.hashとparams [:hash]の両方を "put"します。チェックしましょう:) – Eduardo
また、これはエンコードと関係があります。比較の前に両方の文字列でこれを実行するとどうなりますか? '.force_encoding(Encoding :: BINARY)'(16進数が既にASCIIのような親和的な方法でコード化されていない限り、例えばBase 64) – Linuxios