2017-09-06 6 views
3

私のプログラムで問題が発生しました。たとえば、 "www.google.com"のようなリンクをDBに追加します。リンクをクリックするとリダイレクトされますlocalhost:3000/www.google.com、これはDBに "http://www.google.com"を入力したときは発生しません。どのようにして 'link_to'をRailsでAbsoluteに変換するのですか

私のコード私は絶対に、常にこのリンクを変換するために作るにはどうすればよい

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

? (私はこの解決策だと思う)

ありがとう!!それはあなたがすべてのリンクはhttpとhttpsでない保存したいと仮定し..but

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

+2

多分、単にあなたのデータベースを更新し、「HTTPを追加します//"どこに必要? –

+1

@SergioTulentsevが推奨することをお勧めします。 https://stackoverflow.com/questions/7908598/add-https-to-url-if-its-not-there – AbM

+0

しかし、私はDBを変更することはできませんが、私がいつも自分のコードを修正した場合に限りますリンクに保存するには、httpまたはhttpsを入力します。しかし、それはただ1つのオプションでしか動作しません –

答えて

0

あなたのような何かを行うことができます。 DBにリンクを保存する前に、プロトコルをチェックする方が良いでしょう。例えば

、あなたはこの答えは示唆して何を行う可能性: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 

あなたはちょうどあなたが既に持っているものを行うことができますこの方法。

+0

あなたのソリューションは今のところ最高ですが、httpやhttpsのいずれかを選択する必要があります。私はそれがDB欄にあるもののために指示したいと思います –

+0

私の友人、あなたの甘やかさは働いた。 リンクの上にマウスを置くと、リンク「www.google.com」を表示し、「localhost:3000/www.google.com」は表示されません ありがとうございました! –

0

あなたの最善の策は、データベース内のリンクをすべて標準形式に準拠するように更新することです。また、すべてのリンクが有効なフォーマットに一致することを確認するために、より基本的な検証を追加することができます。

validates :link_to_idea, format: URI.regexp 

あなたはまた、彼らは、このパターンに一致することを確認するために、古いリンクをチェックし、データベース上の埋め戻しを実行してからのものを更新することができますそれはうまくいかない。 MySQLを使用していますか?

いずれにしても、ユーザーが入力した古いものをレンダリングするのではなく、データベースに入る前にデータを消去することをお勧めします。

データベースに入るものを制御できない場合は、テキストとして、Regexpと一致しないものをレンダリングして、ユーザーが自分自身でブラウザに配置できるようにします。

+0

だから私はPostgresを使用していますが、私はDBに変更するアクセス権がありません –

+0

私はそれがうまくいく、単純な検証を追加する(だからあなたは、より汚いデータを取得しないと、正規表現を介して)一致しない場合は、それらをリンクにしないでください。 – apanzerj

0

Draperを使用してデコレータを作成することをお勧めします。これにより、プレゼンテーションロジックをドメインオブジェクトから切り離すことができます。

あなたがそれを設定したら、あなたはこれに似た何かを書くことができます:

# 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 

、ビューで使用されるが:

<%= link_to t.title, t.decorate.idea_url('https') %> 
関連する問題