Sur mon site, un utilisateur a un profil personnel avec un lien vers son site Web externe personnel. L'url des sites que je stocke dans une base de données postgresql sous le nom website. Lorsque je teste le résultat, je reçois toujours une URL comme celle-ci:
http://localhost:3000/www.example.com
au lieu de http://www.example.com
Ma vue index.html.erb ressemble à ceci:
<% provide(:title, 'All projects') %>
<h1>All projects</h1>
<%= will_paginate %>
<ul class="microposts">
<%= render @microposts %>
</ul>
<%= will_paginate %>
et mon _ micropost.html.erb comme ceci:
<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>
Je ne sais pas quel est le problème dans ce cas. Si je mets un @ avant micropost.website cela me donne une erreur méthode non définie `website 'pour nil: NilClass
Quelqu'un peut-il m'aider (je suis un débutant RoR)?
KR, Fabian
Il semble que vous stockiez des URL sans le http://
donc ils sont interprétés comme des URL relatives. Vous avez juste besoin de faire quelque chose comme ça:
link_to micropost.website, "http://#{micropost.website}"
ou peut-être ajouter un full_url
méthode à ce modèle qui l'ajoute s'il est manquant.
Soit dit en passant, vous ne pouvez pas utiliser @micropost
dans ce partiel car il n'existe pas (vous n'avez que @microposts
ou micropost
).
Vous pouvez essayer avec ce code ci-dessous:
<%= link_to "your label", "your link with http", :target => "_blank" %>
Cela va créer un lien qui s'ouvre dans un nouvel onglet.
Vous pouvez faire quelque chose comme ça:
link_to micropost.website, url_for(micropost.website)
Voir Rails Api: url_for
Vous pouvez expérimenter dans la console Rails. Tapez simplement dans la console:
micropost = Micropost.first
helper.link_to micropost.website, url_for(micropost.website)
Et vous voyez une chaîne de résultat.
Vous devez également apprendre la différence entre les assistants de chemin d'accès et les URL. Voir Ruby sur Rails.
Droits de Goro. Vous devez ajouter "http: //" à l'attribut de votre site Web. Après avoir validé et avant d'enregistrer l'instance de modèle dans la base de données, vous devez ajouter ce préfixe.
Vous pouvez utiliser le Ruby classe 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>
Je travaille avec Rails 5 et j'ai eu le même problème. Tout ce que je dois faire pour le corriger, c'était d'inclure le protocole sur mon link_to
tag. Par exemple. J'avais www.google.com.mx
, alors, cela devrait être http://www.google.com.mx
. Et c'est tout, cela fonctionne très bien comme dans le doc officiel est mentionné.
Donc, finalement, j'ai juste quelque chose comme ça à mon avis:
<%= link_to (content_tag(:i, "help", class: 'material-icons tiny')), " http://www.google.com.mx", target: "_blank", rel: "alternate" %>
C'est la même chose que:
<%= link_to "help", "http://www.google.com.mx", target: "_blank", rel: "alternate" %>
J'espère que cela aide quelqu'un d'autre.
J'utilise la gemme postrank-uri pour normaliser l'url avant de la passer à link_to
.
class User < ActiveRecord::Base
def normalized_webpage
webpage && PostRank::URI.normalize(webpage).to_s
end
end
Ensuite, vous pouvez utiliser link_to "website", user.normalized_webpage, target: "_blank"
selon vous. Cela ajoutera par exemple le http://
à l'url, s'il est manquant.