You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Rails技术问询:如何结合block使用link_to跳转外部网站?

这个错误undefined method 'stringify_keys' for "www.google.com":String其实是因为你搞混了带block的link_to参数顺序,我来给你理清楚:

问题根源

当使用link_to的block形式时,语法和无block的不一样:

  • 无block写法:link_to(显示文本, 链接地址, 选项哈希)
  • 有block写法:link_to(链接地址, 选项哈希) do ... end → 这里的block内容就替代了“显示文本”的位置

你之前的代码写了link_to @slides[0].link, "#{@slides[0].link}", target: "_blank" do,相当于多传了一个参数——Rails会把第二个字符串参数当成“选项哈希”来处理,但字符串没有stringify_keys方法(这个方法是哈希专属的),所以直接报错。

正确写法

首先要确保你的@slides[0].link是完整的绝对外部URL(比如https://www.google.com,必须带http://或https://前缀),然后用下面的代码:

<%= link_to @slides[0].link, target: "_blank" do %>
  <div class="carousel-item active">
    <%= image_tag @slides[0].slide_image.thumb.url, class: "d-block w-100", alt: @slides[0].image_text %>
    <div class="carousel-caption d-none d-md-block">
      <h5><%= @slides[0].image_text %></h5>
    </div>
  </div>
<% end %>

额外处理:如果链接没有协议前缀

如果你的link字段只存了www.google.com这种不带协议的内容,Rails会把它当成内部路由路径,导致跳转到localhost:3000/www.google.com。这时候可以在Slide模型里加一个辅助方法来补全前缀:

# app/models/slide.rb
def full_link
  if link.present? && !link.start_with?('http://', 'https://')
    "https://#{link}"
  else
    link
  end
end

然后视图里调用这个方法:

<%= link_to @slides[0].full_link, target: "_blank" do %>
  <!-- 你的div内容 -->
<% end %>

为什么其他写法出错

  • <%= link_to @slides[0].link do %>:如果链接没有协议前缀,Rails会把它当成内部路径,导致跳转错误;如果有前缀,这个写法本身没问题,但缺少target: "_blank"的话不会在新窗口打开。
  • <%= link_to url_for(@slides[0].link) do %>:url_for对于不带协议的字符串会当成内部路径拼接,所以才会出现localhost:3000/https://google.com的情况——其实只要你的链接是完整绝对URL,直接用字符串就行,不需要url_for。

内容的提问来源于stack exchange,提问作者Lucas Andrade

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 07:16:48