Ссылки на указанные пользователем URL-адреса, интерпретируемые как относительные URL-адреса - PullRequest
0 голосов
/ 21 января 2012

Извините, если на этот вопрос был дан ответ в другом месте, но я потратил некоторое время на поиски без удачи.

В моем веб-приложении я прошу пользователей указывать URL-адреса своих блогов.Однако они не всегда помещают "http://" в начале этих URL-адресов. В другом месте сайта, когда я ссылаюсь на эти URL-адреса, браузер интерпретирует их как относительные URL-адреса. Например, если пользователь пишет bobsblog.wordpress.com,ссылка идет на http://www.mydomain.com/bobsblog.wordpress.com.

. Одним из решений является предварительное заполнение поля url "http://".

. Но более удачным решением было бы проанализировать URL-адрес и добавить схему, еслипользователь не имеет.Предлагает ли рельсы хороший способ сделать это?Я посмотрел на функцию URI :: parse, но, похоже, она не дает хорошего способа сделать это.

Ответы [ 2 ]

1 голос
/ 21 января 2012

Вы можете использовать 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 голосов
/ 21 января 2012

Может быть, в вашей модели у вас может быть метод для возврата 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://" на передней панели.

...