0

この質問が他の場所で回答されている場合は申し訳ありませんが、運が悪いのでしばらく探しました。

私の Web アプリでは、ユーザーにブログの URL を指定するように求めています。ただし、常にこれらの URL の先頭に「http://」を付けるとは限りません。サイトの他の場所で、これらの URL にリンクすると、ブラウザーはそれらを相対 URL として解釈します。たとえば、ユーザーが bobsblog.wordpress.com と書いた場合、リンクはhttp://www.mydomain.com/bobsblog.wordpress.comに移動します。

解決策の 1 つは、URL フィールドに「http://」を事前入力することです。

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

4

2 に答える 2

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" 
于 2012-01-21T19:25:52.510 に答える
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://」を先頭にして保存されます。

于 2012-01-20T23:18:47.870 に答える