【问题标题】:How do I defined a variable link_to to an external URL如何将变量 link_to 定义为外部 URL
【发布时间】:2013-05-23 18:57:55
【问题描述】:

在我的网站上,用户拥有个人资料,其中包含指向其个人外部网站的链接。我存储在名为 website 的 postgresql 数据库中的网站的 url。当我测试结果时,我总是得到这样的 url:

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

而不是http://www.example.com

我的视图 index.html.erb 看起来像这样:

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

<%= will_paginate %>

<ul class="microposts">
    <%= render @microposts %>
</ul>

<%= will_paginate %>

和我的 _micropost.html.erb 像这样:

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

我不知道在这种情况下有什么问题。如果我在 micropost.website 之前设置了一个@,它会给我一个错误 undefined method `website' for nil:NilClass

有人可以帮助我吗(我是 RoR 初学者)?

韩国,费边

【问题讨论】:

  • 并非如此。如果我在 _micropost.html.erb 中写 &lt;span class="website"&gt;&lt;%= link_to micropost.website, micropost.website %&gt;&lt;/span&gt;,我还会得到一个 undefined method `website' for nil:NilClass 错误
  • 如果是这样,您不应该先在上面的行中获取undefined method title for nil:NilClass 吗? &lt;span class="title"&gt;&lt;%= micropost.title %&gt;&lt;/span&gt;
  • @JoeFrambach no,&lt;%= micropost.title %&gt; 工作正常,但如果我将其更改为 &lt;%= @micropost.title %&gt;,我也会得到同样的错误(但这次是标题)
  • 这怎么不是重复的

标签: ruby-on-rails ruby-on-rails-3 link-to


【解决方案1】:

听起来您存储的 URL 没有 http://,因此它们被解释为相对 URL。你只需要这样做:

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

或者可能向该模型添加一个 full_url 方法,如果它丢失,则添加它。

顺便说一句,您不能在该部分中使用@micropost,因为它不存在(您只有@micropostsmicropost)。

【讨论】:

  • 谢谢,已经试过了,效果很好。抱歉,但对于我作为初学者来说,上述答案还不够清楚,无法看到我的问题与提到的其他堆栈溢出问题中的问题之间的相似性。对不起这个新手愚蠢的大脑;-)
【解决方案2】:

你可以试试下面的代码:

&lt;%= link_to "your label", "your link with http", :target =&gt; "_blank" %&gt;

这将创建一个在新选项卡中打开的链接。

【讨论】:

  • 感谢这对我有帮助。
【解决方案3】:

你可以这样做:

link_to micropost.website, url_for(micropost.website)

Rails Api: url_for

您可以在 Rails 控制台中进行实验。 只需输入控制台:

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

你会看到一个结果字符串。

您还需要了解路径和 url 助手之间的区别。 见ruby on rails guide.

五郎权利。您需要将“http://”添加到您的网站属性。 在验证之后和将模型实例保存到数据库之前,您需要添加此前缀。

【讨论】:

    【解决方案4】:

    你可以使用红宝石URI class

    = 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>
    

    【讨论】:

    • 请注意,如果“网站”包含“https”、“http”甚至“ftp”之类的协议,则会引发错误
    【解决方案5】:

    我使用 postrank-uri gem 来规范化 URL,然后将其传递给 link_to

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

    然后你可以在你的视图中使用link_to "website", user.normalized_webpage, target: "_blank"。例如,这会将 http:// 添加到 url,如果它丢失了。

    【讨论】:

      【解决方案6】:

      我正在使用 Rails 5,我遇到了同样的问题。我需要做的就是修复它,将协议包含在我的link_to 标签上。例如。我有www.google.com.mx,那么应该是http://www.google.com.mx。就是这样,它工作得很好,就像提到的official doc 一样。

      所以,最后我的看法是这样的:

      <%= 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" %>
      

      我希望它可以帮助其他人。

      【讨论】:

        【解决方案7】:

        这就是我所做的。

        假设我们有@person,他有一个链接 (@person.link) # => www.google.com

        在你的助手中创建类似的东西

        def extlink(link)
        
         if link.include?("http://")
          puts link
         else
          link.insert(0, "http://")
          link
         end
        

        结束

        在你的文件中你可以做

        <% @person.each do |p| %>
        
        <%= link_to 'External', extlink(p.link) %>
        
        <% end %>
        

        为我工作

        【讨论】:

        • 这不适用于指向其他协议的链接,例如 https://ftp://,或者像 spotify:// 这样的广泛的应用程序协议 - 如果你愿意,也许只匹配 ://使用这种方法。尽管如此,在输入时验证 URL 会更好
        • 也许并不完美,但让我想到了。谢谢!
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-03-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多