2017-09-06 1 views
3

Ich habe ein Problem in meinem Programm, ich füge in DB einen Link, zum Beispiel, "www.google.com" und wenn ich klicke in den Link bin ich weitergeleitet localhost: 3000/www.google.com, das passiert nicht, wenn ich "http://www.google.com" in DB setze.Wie konvertieren 'link_to' zu Absolute in Rails

Mein Code

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

Wie kann ich absolut diesen Link immer konvertieren machen? (Ich denke, das ist die Lösung)

Danke !!

+2

vielleicht einfach Ihre Datenbank aktualisieren und fügen Sie „http://" wo benötigt? –

+1

Ich schlage vor, zu tun, was @ SergioTulentsev empfohlen. https://stackoverflow.com/questions/7908598/add-https-to-url-if-its-not-there – AbM

+0

Aber ich ermächtige nicht, die DB zu ändern, nur wenn ich meinen Code zu immer im Moment ändere von speichern, um zu verknüpfen, legen Sie die http oder https. Aber es funktioniert nur eine Option –

Antwort

0

Man könnte so etwas wie tun:

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

..aber dass vorausgesetzt, dass Sie alle Verbindungen mit speichern möchten http und https nicht. Sie suchen wahrscheinlich besser nach dem Protokoll, bevor Sie den Link in der Datenbank speichern.

Zum Beispiel könnten Sie tun, was diese Antwort schon sagt: 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 

Auf diese Weise können Sie einfach tun, was Sie bereits haben.

+0

Ich denke Ihre Lösung ist die beste bis zu diesem Moment, aber wie sagt man, ich muss eine Option wählen, http oder https.Ich würde gerne gerichtet, das ist, was in der DB-Spalte ist –

+0

Mein Freund, Ihre Unterordnung es funktioniert. Jetzt, als ich die Maus über den Link setzte, zeigen Sie mir den Link "www.google.com" und nicht mehr "localhost: 3000/www.google.com" Vielen Dank !!! –

0

Ich denke, Ihre beste Wette ist, die Links in Ihrer Datenbank zu aktualisieren, die alle einem Standardformat entsprechen. Sie können auch eine grundlegende Überprüfung, um sicherzustellen, fügen Sie alle Verbindungen ein gültiges Format entsprechen:

validates :link_to_idea, format: URI.regexp 

Sie auch eine Verfüllung auf Ihrer Datenbank ausführen kann, die alten Links überprüft, um sicherzustellen, dass sie dieses Muster entsprechen, und dann die, die aktualisieren das funktioniert nicht. Verwenden Sie MySQL?

Wie auch immer, die beste Antwort besteht nicht darin, zu versuchen, dass Ihre App etwas Altes wiedergibt, das der Benutzer eingibt, sondern die Daten zu bereinigen, bevor sie in die Datenbank gelangen.

Wenn Sie nicht kontrollieren können, was in die Datenbank geht, würde ich einfach alles, was nicht mit diesem Regexp übereinstimmt, als Text rendern und die Benutzer selbst in ihren Browser einfügen lassen.

+0

So, ich benutze Postgres, aber ich habe keine Notwendigkeit, zu DB –

+0

zu ändern Ich denke, das ist in Ordnung, einfach die Validierung hinzufügen (damit Sie nicht schmutzig Daten erhalten, und überprüfen Sie die URLs, die Sie auf der Seite ausgeben über die Regex) und wenn sie nicht übereinstimmen, dann mach sie nicht zu einem Link. – apanzerj

0

Ich würde vorschlagen, dass Sie einen Dekorateur mit Draper erstellen. Dadurch können Sie die Präsentationslogik von Ihrem Domänenobjekt entkoppeln.

Sobald Sie es einrichten dann Sie etwas Ähnliches wie dieses schreiben konnte:

# 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 

Und in der Ansicht verwendet:

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