2012-01-20 16 views
0

この質問には別の場所で回答されている場合は申し訳ありませんが、しばらくお待ちください。相対URLとして解釈されるユーザー指定のURLへのリンク

私のウェブアプリケーションでは、ブログにURLを指定するようにユーザーに依頼しています。ただし、これらのURLの先頭に必ず「http://」を付けるわけではありません。サイトのどこかで、これらのURLにリンクすると、ブラウザはそれらを相対URLとして解釈します。例えばユーザーがbobsblog.wordpress.comを書き込むと、リンクはhttp://www.mydomain.com/bobsblog.wordpress.comになります。

解決策の1つは、URLフィールドに "http://"をあらかじめ入力することです。

しかし、より良い解決策は、URLを解析し、ユーザーがそうでない場合にスキームを追加することです。レールはこれを行う良い方法を提供していますか?私は関数URI :: parseを見ましたが、それを行う良い方法を提供していないようです。

答えて

1

URI.parseを使用してスキームを確認できます。ここで

before_save :sanitize_url 

def sanitize_url 
    uri = URI.parse(url) 
    self.url = "http://#{url}" if uri.scheme.blank? 
rescue URI::InvalidURIError => e 
    # not a parseable URI, so you need to handle that 
end 

いくつかの出力

ree-1.8.7-2011.03 :035 > x = URI.parse "http://google.com" 
=> #<URI::HTTP:0x1069720c8 URL:http://google.com> 
ree-1.8.7-2011.03 :036 > x.scheme 
=> "http" 
ree-1.8.7-2011.03 :037 > y = URI.parse "google.com" 
=> #<URI::Generic:0x1069672e0 URL:google.com> 
ree-1.8.7-2011.03 :038 > y.scheme 
=> nil 
ree-1.8.7-2011.03 :039 > z = URI.parse "https://google.com" 
=> #<URI::HTTPS:0x10695b8f0 URL:https://google.com> 
ree-1.8.7-2011.03 :040 > z.scheme 
=> "https" 
0

あなたのモデルでは、URLを絶対URLとして返す方法があります。 "http://"で始まらない場合は、それを前面に追加してください。

def abs_url 
    (url.start_with? "http://") ? url : ("http://" + url) 
end 

そして、あなたの意見では、ちょうど@user.abs_urlのようにしてください。


編集:ああ、私は実現しなかったが、あなたはおそらく、提出時にこれをやってみたかったです。保存前に同様のロジックを実行することができます。その場合:

before_save :abs_url 
... 
def abs_url 
    url = (url.start_with? "http://") ? url : ("http://" + url) 
end 

URLは「http://」の前に保存されます。

+0

どうもありがとうございました!また、「https://」で始まるURLもそのままで(http:// prependedは必要ありません)、大丈夫です。 –

関連する問題