На моем сайте у пользователя есть личный профиль со ссылкой на его личный внешний сайт. url сайтов я храню в базе данных postgresql под именем website. Когда я проверяю результат, я всегда получаю 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 %>
а мой _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 method `website' for nil:NilClass.
Кто-нибудь может мне помочь (я новичок в RoR)?
KR, Фабиан
Похоже, что вы храните URL без http://
, поэтому они интерпретируются как относительные URL. Вам просто нужно сделать что-то вроде этого:
link_to micropost.website, "http://#{micropost.website}"
или добавить метод full_url
в эту модель, который добавляет его, если он отсутствует.
Кстати, вы не можете использовать @micropost
в этой частичной модели, потому что она не существует (у вас есть только @microposts
или micropost
).
Вы можете попробовать этот код ниже:
в <%= link_to "и ваш метки на", "по вашей ссылке с HTTP наша": цель => наша "настроек" в %>
Будет создана ссылка, которая открывается в новой вкладке.
Вы можете сделать что-то подобное:
link_to micropost.website, url_for(micropost.website)
Вы можете поэкспериментировать в консоли rails. Просто введите в консоли:
micropost = Micropost.first
helper.link_to micropost.website, url_for(micropost.website)
И вы увидите строку результатов.
Также вам нужно узнать разницу между помощниками path и url. Смотрите руководство по ruby on rails..
Права Горо. Вам необходимо добавить "http://" к атрибуту вашего сайта. После валидации и перед сохранением экземпляра модели в базу данных необходимо добавить этот префикс.
Вы можете использовать Руби класс 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>
Я использую postrank-Ури камень для нормализации URL-адрес, прежде чем передать его link_to
.
class User < ActiveRecord::Base
def normalized_webpage
webpage && PostRank::URI.normalize(webpage).to_s
end
end
Затем вы можете использовать link_to "на сайте", пользователей.normalized_webpage, цель:, что "настроек"
в в ваш вид. Это позволит, например, добавить с HTTP://` в URL-адрес, если это's отсутствует.
Я'м работает с рельсами 5 и у меня была такая же проблема. Все, что мне нужно сделать, чтобы исправить это, было включить протокол о теге мой link_to
. Е. Г. Я www.google.com.mx
, то это должно быть http://www.google.com.mx
. И что's это все работает просто замечательно, как в официальный док упоминается.
Так, Наконец, я просто что-то вроде этого на мой взгляд:
<%= 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" %>
Я надеюсь, что это помогает кто-то другой.
Вот что я сделал.
Допустим, у нас есть @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 %>
У меня работает