Rails技术问询:如何结合block使用link_to跳转外部网站?
解决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
相关产品推荐
相关产品推荐

