Як я вызначыў зменную link_to на знешні URL

На маім сайце карыстальнік мае асабісты профіль са спасылкай на яго асабісты знешні вэб-сайт. URL сайтаў захоўваць у базе дадзеных PostgreSQL пад назвай <�моцны> сайт . Калі я праверыць вынік, я заўсёды атрымліваю URL накшталт гэтага:

http://localhost:3000/www.example.com

instead of http://www.example.com

Мой выгляд <�моцны> index.html.erb выглядае наступным чынам:

<% provide(:title, 'All projects') %>

All projects

<%= will_paginate %>

    <%= render @microposts %>
<%= will_paginate %>

і мой <�моцны> _micropost.html.erb , як гэта:

  • <%= micropost.title %> <%= link_to micropost.website, micropost.website %> <%= micropost.content %> Posted <%= time_ago_in_words(micropost.created_at) %> ago.
  •  
    

    I don't know what's the problem in this case. If I set a @ before micropost.website it gives me an error undefined method `website' for nil:NilClass

    Хто-небудзь можа мне дапамагчы (я пачатковец RoR)?

    KR, Fabian

    27
    Калі гэта так, то не павінен спачатку атрымаць нявызначанага назву метады для нуль: NilClass ў радку над ім? <�Код> <�прамежак клас = "назва"> <% = micropost.title%>
    дададзена аўтар Joe Frambach, крыніца
    Бо гэта не з'яўляецца дублікатам
    дададзена аўтар Joe Frambach, крыніца
    Магчымы дублікат stackoverflow.com/questions/5012188/…
    дададзена аўтар Luís Ramalho, крыніца
    не зусім. Калі я пішу <�клас пядзю = "сайт"> <% = link_to micropost.website, micropost.website%> ў маім <�б> _micropost.html.erb , Я атрымліваю таксама не вызначаны метад `сайта для нуль: NilClass памылка
    дададзена аўтар Fawyd, крыніца
    @JoeFrambach няма, <% = micropost.title%> працуе нармальна, але калі б я змяніць гэта <% = @ micropost.title%> замест гэтага, я таксама тая ж памылка (але на гэты раз за званне)
    дададзена аўтар Fawyd, крыніца
    @JoeFrambach шкада, што гэта нейкае дубляванай пытанне, але для пачаткоўца значна больш карысным, чым іншыя пытанні. Спадзяюся, што гэта можа пакінуць як намёк на пачаткоўцаў.
    дададзена аўтар Fawyd, крыніца

    7 адказы

    Гэта гучыць, як вы захоўвання URL-адрасоў без Http:// таму яны інтэрпрэтуюцца як адносныя URL. Вам проста трэба зрабіць нешта накшталт гэтага:

    link_to micropost.website, "http://#{micropost.website}"
    

    ці, можа быць, дадаць full_url метад для гэтай мадэлі, якая дадае яго, калі ён адсутнічае.

    Дарэчы, вы не можаце выкарыстоўваць @micropost ў тым, што частковае, таму што не існуе (у вас ёсць толькі @microposts або micropost ) ,

    55
    дададзена
    дзякуй, паспрабаваў гэта, і гэта добра працуе. Выбачайце, але для мяне, як пачатковец вышэйзгаданых адказаў не былі дастаткова яснымі, каб убачыць падабенства паміж маёй праблемай і задачамі ў паказаным іншы перапаўнення стэка-пытанні. На жаль для гэтага пачаткоўца тупога мозгу ;-)
    дададзена аўтар Fawyd, крыніца

    Вы можаце паспрабаваць з гэтым ніжэй код:

    <%= link_to "your label", "your link with http", :target => "_blank" %>

    Гэта дазволіць стварыць спасылку, якая адкрываецца ў новай ўкладцы.

    13
    дададзена
    Дзякуючы гэта дапамагло мне.
    дададзена аўтар bradpotts, крыніца

    Вы можаце зрабіць нешта накшталт гэтага:

    link_to micropost.website, url_for(micropost.website)
    

    See Rails Api: url_for

    Вы можаце эксперыментаваць ў рэйках кансолі. Проста ўвядзіце ў кансолі:

    micropost = Micropost.first
    helper.link_to micropost.website, url_for(micropost.website)
    

    І вы бачыце радкі выніку.

    Also you need to learn the difference between path and url helpers. See ruby on rails guide.

    правы Горо. Вам трэба дадаць «HTTP: //» у атрыбуце сайта. Пасля праверкі і да асобніка захавання мадэлі ў базу дадзеных трэба дадаць гэты прэфікс.

    3
    дададзена

    Вось што я зрабіў.

    Let's say we have @person and he has a link (@person.link) # => www.google.com

    ў вашых памочнікаў стварыць нешта накшталт гэтага

    def extlink(link)
    
     if link.include?("http://")
      puts link
     else
      link.insert(0, "http://")
      link
     канец
    

    канец

    І ў файле вы можаце зрабіць

    <% @person.each do |p| %>
    
    <%= link_to 'External', extlink(p.link) %>
    
    <% канец %>
    

    Праца для мяне

    2
    дададзена
    Гэта не будзе працаваць для спасылак на іншыя пратаколы, такія як https://, FTP://, або шырокі спектр пратаколаў прыкладанняў, напрыклад Spotify:// - магчыма, проста адпавядае ://, калі вы жадаеце выкарыстоўваць гэты метад. Сказаўшы ўсё гэта, хоць, было б лепш, каб праверыць URL на ўваходзе
    дададзена аўтар Barry, крыніца

    You can use the ruby URI class

    = link_to micropost.website, URI::HTTP.build({:host => micropost.website}).to_s, target: "_blank"
    
    # www.example.com
    
    1
    дададзена

    Я выкарыстоўваю PostRank-URI камень для нармалізацыі URL перад перадачай яго ў link_to .

    class User < ActiveRecord::Base
      def normalized_webpage
        webpage && PostRank::URI.normalize(webpage).to_s
      end
    end
    

    Затым вы можаце выкарыстоўваць link_to "сайт", user.normalized_webpage, мэта: "_blank" ў прадстаўленні. Напрыклад, гэта можа дадаць Http:// ў URL, калі ён адсутнічае.

    0
    дададзена

    Я працую з Rails 5 і ў мяне была такая ж праблема. Усё, што мне трэба зрабіць, каб выправіць гэта, павінна было ўключаць пратакол аб маім link_to тэга. напрыклад У мяне быў <�моцны> www.google.com.mx , то яно павінна быць <�моцны> HTTP://WWW .google.com.mx . І гэта ўсё гэта выдатна працуе як у афіцыйны дакумент згадваецца.

    Так што, у рэшце рэшт я проста нешта накшталт гэтага, на мой погляд:

    <%= link_to (content_tag(:i, "help", class: 'material-icons tiny')), " http://www.google.com.mx", target: "_blank", rel: "alternate" %>
    

    Што ж, як:

    <%= link_to "help", "http://www.google.com.mx", target: "_blank", rel: "alternate" %>
    

    Я спадзяюся, што гэта дапамагае каму-то яшчэ.

    0
    дададзена