首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >link_to_unless问题

link_to_unless问题
EN

Stack Overflow用户
提问于 2011-04-20 23:16:51
回答 4查看 701关注 0票数 2

我在一个视图中有这个RoR代码片段:

代码语言:javascript
复制
<%= link_to_unless(@posts_pages[:previous].nil?, 
  "Previous", 
  blog_with_page_path(:page_num => @posts_pages[:previous])) %>

这里的blog_with_page是一个命名路由。如果@posts_pages[:previous].nil?false (正如预期的那样),并且正确生成了链接,则代码段可以正常工作。但是,当@posts_pages[:previous].nil?true时,不是简单地获取"Previous"字符串,而是收到一个错误,告诉我无法使用:page_num=>nil生成路由。这是预期的行为吗?如果满足条件,则不应计算路由代码,对吗?下面是完整的错误:blog_with_page_url failed to generate from {:page_num=>nil, :action=>"show", :controller=>"pages"}, expected: {:action=>"show", :controller=>"pages"}, diff: {:page_num=>nil}

我一直在查看link_to_unless代码,但我不明白为什么会出现这个错误,因为它应该只返回名称:

代码语言:javascript
复制
# File actionpack/lib/action_view/helpers/url_helper.rb, line 394
  def link_to_unless(condition, name, options = {}, html_options = {}, &block)
    if condition
      if block_given?
        block.arity <= 1 ? capture(name, &block) : capture(name, options, html_options, &block)
      else
        name
      end
    else
      link_to(name, options, html_options)
    end
  end

我使用的是Rails 2.3.11和Ruby 1.8.7

干杯!

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-04-20 23:31:07

因为Ruby不是一种惰性语言,所以只要您调用它,link_to_unless就会立即计算blog_with_page_path(:page_num => @posts_pages[:previous])的值,而不管它的值是否被link_to_unless使用过。

票数 2
EN

Stack Overflow用户

发布于 2011-04-20 23:35:56

考虑到其他各种可以解释你的问题的答案,为什么不试试这个作为你的解决方案:

代码语言:javascript
复制
link_to( "Previous", blog_with_page_path(:page_num => @posts_pages[:previous]) ) unless @posts_pages[:previous].nil?

这将首先计算“除非”条件,当@post_pages[:previous]为nil时,避免使用虚假的link_to。

-编辑--

正如评论中所指出的,由于您需要找回字符串,因此最简单的方法可能只是一个三元:

代码语言:javascript
复制
@posts_pages[:previous].nil? ? "Previous" : link_to( "Previous", blog_with_page_path(:page_num => @posts_pages[:previous]) )
票数 1
EN

Stack Overflow用户

发布于 2011-04-20 23:29:51

看起来像是窃听器。这段代码不是“懒惰的”,所以它执行所有的语句。所以你可以选择三种方式:

  1. Patch it
  2. Make simple
  3. it:

像这样

代码语言:javascript
复制
<%= link_to_unless(@posts_pages[:previous].nil?, 
  "Previous", 
  blog_with_page_path(:page_num => @posts_pages[:previous] || 0)) %>

您可以设置任何数字,而不是0,它永远不会被设置

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5732689

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档