Как определить переменную link_to для внешнего URL-адреса
На моем сайте пользователь имеет личный профиль со ссылкой на свой персональный внешний веб-сайт. URL-адрес сайтов, которые я храню в базе данных postgresql, под названием веб-сайт. Когда я проверяю результат, я всегда получаю такой URL:
http://localhost:3000/www.example.com
вместо http://www.example.com
Мой вид index.html.erb выглядит следующим образом:
<% provide(:title, 'All projects') %>
<h1>All projects</h1>
<%= will_paginate %>
<ul class="microposts">
<%= render @microposts %>
</ul>
<%= will_paginate %>
и my _micropost.html.erb:
<li>
<span class="title"><%= micropost.title %></span>
<span class="website"><%= link_to micropost.website, micropost.website %></span>
<span class="content"><%= micropost.content %></span>
<span class="timestamp">
Posted <%= time_ago_in_words(micropost.created_at) %> ago.
</span>
</li>
Я не знаю, в чем проблема. Если я установил @до micropost.website, он дал мне ошибку undefined метод `website 'для nil: NilClass
Кто-нибудь может мне помочь (я новичок RoR)?
KR, Фабиан
Ответы
Ответ 1
Похоже, что вы сохраняете URL-адреса без http://
, поэтому их интерпретируют как относительные URL-адреса. Вам просто нужно сделать что-то вроде этого:
link_to micropost.website, "http://#{micropost.website}"
или, возможно, добавить к этой модели метод full_url
, который добавляет его, если он отсутствует.
Кстати, вы не можете использовать @micropost
в этом частичном, потому что он не существует (у вас есть только @microposts
или micropost
).
Ответ 2
Вы можете попробовать с помощью этого ниже кода:
<%= link_to "your label", "your link with http", :target => "_blank" %>
Это создаст ссылку, которая открывается на новой вкладке.
Ответ 3
Вы можете сделать что-то вроде этого:
link_to micropost.website, url_for(micropost.website)
См. Rails Api: url_for
Вы можете экспериментировать в консоли rails.
Просто введите консоль:
micropost = Micropost.first
helper.link_to micropost.website, url_for(micropost.website)
И вы увидите строку результата.
Также вам нужно узнать разницу между помощниками пути и URL.
См. рубиновый путеводитель по направляющим.
Права Горо. Вам нужно добавить "http://" к вашему атрибуту веб-сайта.
После проверки и до сохранения экземпляра модели в базу данных вам нужно добавить этот префикс.
Ответ 4
Я использую postrank-uri gem, чтобы нормализовать URL-адрес, прежде чем передавать его на link_to
.
class User < ActiveRecord::Base
def normalized_webpage
webpage && PostRank::URI.normalize(webpage).to_s
end
end
Затем вы можете использовать link_to "website", user.normalized_webpage, target: "_blank"
в своем представлении. Это, например, добавит http://
к URL-адресу, если он отсутствует.
Ответ 5
Вы можете использовать класс ruby URI
= link_to micropost.website, URI::HTTP.build({:host => micropost.website}).to_s, target: "_blank"
# <a target="_blank" href="http://www.example.com">www.example.com</a>
Ответ 6
Я работаю с Rails 5, и у меня такая же проблема. Все, что мне нужно сделать, чтобы исправить это, было включение протокола в тег link_to
. Например. У меня было www.google.com.mx
, тогда оно должно быть http://www.google.com.mx
. И что он работает отлично, как в официальный документ.
Итак, наконец, у меня есть что-то вроде этого на мой взгляд:
<%= link_to (content_tag(:i, "help", class: 'material-icons tiny')), " http://www.google.com.mx", target: "_blank", rel: "alternate" %>
Это то же самое, что:
<%= link_to "help", "http://www.google.com.mx", target: "_blank", rel: "alternate" %>
Я надеюсь, что это поможет кому-то другому.
Ответ 7
Вот что я сделал.
Скажем, у нас есть @person, и у него есть ссылка (@person.link) # = > www.google.com
в ваших помощниках создайте что-то вроде этого
def extlink(link)
if link.include?("http://")
puts link
else
link.insert(0, "http://")
link
end
конец
И в вашем файле вы можете сделать
<% @person.each do |p| %>
<%= link_to 'External', extlink(p.link) %>
<% end %>
Работает для меня