Rails HAML条件link_to

时间:2012-09-06 08:24:59

标签: ruby-on-rails ruby haml dry

美好的一天,我有这样的代码:

= link_to some_url do
  PLENTY OF MARKUP HERE

现在我需要使这个链接可选,所以如果不满足条件我需要打印明文MARKUP,所以首先反DRY解决方案:

- if condition
  = link_to some_url do
    PLENTY OF MARKUP HERE
-else
  PLENTY OF MARKUP HERE REPEATED :(

如果将PLENTY OF MARKUP置于局部的另一个解决方案,那么如果在没有局部的情况下另一个简单的解决方案又在哪里?我试过这个:

= link_to_if condition?, some_url do
  PLENTY OF MARKUP HERE

但遗憾的是link_to_if在这里没有按预期工作。

2 个答案:

答案 0 :(得分:1)

link_to_if相比,

link_to将该块用于其他目的。所以它无法做你想做的事。

您可以定义自己的助手来做您想做的事。

如果您只需要执行此操作几次,而不是使用自定义帮助程序,则可以将块的结果(PLENTY OF MARKUP)保存到局部变量,以便您轻松使用反复使用它。例如:

- plentyofmarkup = do
  PLENTY OF MARKUP HERE

- if condition
  = link_to (raw plentyofmarkup), some_url
- else
  = raw plentyofmarkup

或者:

= link_to_if condition, (raw plentyofmarkup), some_url

请注意,raw函数用于阻止Rails自动转义字符串。

要定义自己的帮助方法,请尝试:

def link_to_if_do condition, options = {}, html_options = {}
  blockresult = yield
  link_to_if condition, blockresult, options, html_options
end

答案 1 :(得分:0)

您总是可以编写自己的条件链接助手,并将其放在application_helper中:

def conditional_link_to( condition, url, options = {}, html_options = {}, &block ) do
  if condition
    link_to(name, options, html_options, &block)
  else
    if block_given?
      block.arity <= 1 ? capture(name, &block) : capture(name, options, html_options, &block)
    else
      name
    end
  end
end

这主要取自link_to_unless,但已修改为将块传递给link_to。我没有测试过这个,但它应该足以给你一个想法。 :)