我在一个视图中有这个RoR代码片段:
<%= 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代码,但我不明白为什么会出现这个错误,因为它应该只返回名称:
# 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
干杯!
发布于 2011-04-20 23:31:07
因为Ruby不是一种惰性语言,所以只要您调用它,link_to_unless就会立即计算blog_with_page_path(:page_num => @posts_pages[:previous])的值,而不管它的值是否被link_to_unless使用过。
发布于 2011-04-20 23:35:56
考虑到其他各种可以解释你的问题的答案,为什么不试试这个作为你的解决方案:
link_to( "Previous", blog_with_page_path(:page_num => @posts_pages[:previous]) ) unless @posts_pages[:previous].nil?这将首先计算“除非”条件,当@post_pages[:previous]为nil时,避免使用虚假的link_to。
-编辑--
正如评论中所指出的,由于您需要找回字符串,因此最简单的方法可能只是一个三元:
@posts_pages[:previous].nil? ? "Previous" : link_to( "Previous", blog_with_page_path(:page_num => @posts_pages[:previous]) )发布于 2011-04-20 23:29:51
看起来像是窃听器。这段代码不是“懒惰的”,所以它执行所有的语句。所以你可以选择三种方式:
像这样
<%= link_to_unless(@posts_pages[:previous].nil?,
"Previous",
blog_with_page_path(:page_num => @posts_pages[:previous] || 0)) %>您可以设置任何数字,而不是0,它永远不会被设置
https://stackoverflow.com/questions/5732689
复制相似问题