web-dev-qa-db-fra.com

Comment définir une variable link_to vers une URL externe

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

32
Fawyd

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).

61
Goro

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.

19
Dimang Chou

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.

3
s.vatagin

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>
2
Eric Norcross

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.

0
Alex Ventura

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.

0
Oleander