2017-09-06 2 views
3

J'ai un problème dans mon programme, j'ajoute dans DB un lien, par exemple, "www.google.com" et quand je clique sur le lien je suis redirigé vers localhost: 3000/www.google.com, cela ne se produit pas lorsque je mets "http://www.google.com" dans DB.Comment convertir 'link_to' en Absolute in Rails

Mon code

<td><%= link_to t.title, t.link_to_idea, :target => "_blank" %></td> 

Comment puis-je faire pour convertir ce lien toujours dans l'absolu? (Je pense que c'est la solution)

Merci!

+2

peut-être simplement mettre à jour votre base de données et ajouter « http:// "si nécessaire? –

+1

Je suggère de faire ce que @SergioTulentsev recommandé. https://stackoverflow.com/questions/7908598/add-https-to-url-if-its-not-there – AbM

+0

Mais je ne permets pas de modifier la DB, seulement si je modifie mon code pour toujours, dans le moment d'enregistrer au lien, mettre le http ou https. Mais cela ne fonctionne que pour une seule option –

Répondre

0

Vous pouvez faire quelque chose comme:

<td><%= link_to t.title, t.link_to_idea.start_with?('http') ? t.link_to_idea : "http://#{t.link_to_idea}", :target => "_blank" %></td> 

..mais que suppose que vous voulez tous les liens pour enregistrer avec http et non https. Il vaut probablement mieux vérifier le protocole avant de sauvegarder le lien dans la base de données.

Par exemple, vous pouvez faire ce que suggère cette réponse: Add http(s) to URL if it's not there?

before_validation :smart_add_url_protocol 

protected 

def smart_add_url_protocol 
    unless self.url[/\Ahttp:\/\//] || self.url[/\Ahttps:\/\//] 
    self.url = "http://#{self.url}" 
    end 
end 

De cette façon, vous pouvez simplement faire ce que vous avez déjà.

+0

Je pense que votre solution est la meilleure jusqu'à ce moment, mais comment dites-vous, je dois choisir une option, http ou https.Je voudrais diriger c'est pour ce qui est dans la colonne DB –

+0

Mon ami, votre sugestion cela a fonctionné. Maintenant, quand je mets la souris sur le lien, montrez-moi le lien "www.google.com" et non plus "localhost: 3000/www.google.com" Merci beaucoup! –

0

Je pense que votre meilleur pari est de mettre à jour les liens dans votre base de données pour tous se conformer à un format standard. Vous pouvez également ajouter une validation plus basique pour vous assurer que tous les liens correspondent à un format valide:

validates :link_to_idea, format: URI.regexp 

Vous pouvez également exécuter un remblai sur la base de données qui vérifie les anciens liens pour vous assurer qu'ils correspondent à ce modèle et mettre à jour les ça ne marche pas. Utilisez-vous MySQL? De toute façon, la meilleure réponse est de ne pas essayer de rendre votre application restituant quelque chose d'ancien que l'utilisateur place, mais de nettoyer les données avant qu'elles ne pénètrent dans la base de données.

Si vous ne pouvez pas contrôler ce qui se passe dans la base de données, je rendrais simplement, en tant que texte, tout ce qui ne correspond pas à cette expression régulière et laisserais les utilisateurs les mettre dans leur propre navigateur.

+0

Donc, j'utilise Postgres, mais je n'ai pas accès à la DB –

+0

Je pense que c'est bien, ajoutez simplement la validation (donc vous n'obtenez pas plus de données sales, et vérifiez les URL que vous affichez sur la page (via le Regex) et s'ils ne correspondent pas, ne leur faites pas de lien. – apanzerj

0

Je vous suggère de créer un décorateur en utilisant Draper. Cela vous permettra de découpler la logique de présentation de votre objet domaine.

Une fois que vous avez configuré, vous pouvez alors écrire quelque chose de similaire à ceci:

# app/decorators/idea_decorator.rb 
class IdeaDecorator < Draper::Decorator 
    delegate_all 

    def idea_url(protocol = 'https') 
    return link_to_idea if has_scheme? 

    "#{protocol}://#{link_to_idea}" 
    end 

    private 

    def has_scheme? 
    # .. some method here to determine if the URL has a protocol 
    end 
end 

Et utilisé dans la vue:

<%= link_to t.title, t.decorate.idea_url('https') %>