如果满足条件,如何使用块创建link_to_if?

时间:2018-02-19 14:23:07

标签: ruby-on-rails

我想仅在条件符合以下link_to_if时才呈现链接:

<%= link_to_if policy(@user.add?), new_entry_path(), class: 'btn' do %>
  <%= glyphicon("plus") %>
<% end %>

只有满足glypicon("plus")的条件时,才应调用具有link_to_if辅助方法的块。无论条件是真还是假,总是调用块上面的代码。

如果条件返回true,我如何创建链接及其内部内容?

4 个答案:

答案 0 :(得分:4)

此方法的块是“默认”行为,它等同于else语句中的if。这是来源:

  def link_to_if(condition, name, options = {}, html_options = {}, &block)
    if condition
      link_to(name, options, html_options)
    else
      if block_given?
        block.arity <= 1 ? capture(name, &block) : capture(name, options, html_options, &block)
      else
        ERB::Util.html_escape(name)
      end
    end
  end

答案 1 :(得分:2)

只需使用简单的iflink_to

即可
<% if policy(@user.add?) %>
  <%= link_to new_entry_path, class: 'btn' do %>
    <%= glyphicon('plus') %>
  <% end %>
<% end %>

或者你可能想要考虑这样的视图辅助方法:

def link_to_add(url)
  link_to(glyphicon('plus'), url, class: 'btn')
end

可以用来查看:

<%= link_to_add(new_entry_path) if policy(@user.add?) %>

或更通用:

def icon_link(icon, url)
  link_to(glyphicon(icon), url, class: 'btn')
end

可以用来查看:

<%= icon_link('plus', new_entry_path) if policy(@user.add?) %>

答案 2 :(得分:1)

正如@Anthony所指出的,如果条件为假,它将使用该块来确定类似于else语句的输出。

如果没有给出块,则将在没有锚标记的情况下呈现“name”值。为了避免这种情况,您可以像这样传递一个空块

<%= link_to_if(policy(@user.add?),glyphicon('plus'),new_entry_path,class: 'btn') {} %>

由于对块的尊重和块返回nil,所以不会呈现任何内容,但很明显,这里发生的事情的解释与@spickermann提供的答案相差甚远。

答案 3 :(得分:0)

如果您无论如何都想显示该块,但仅在满足特定条件时才添加链接,您可以完全捕获该块:

ggplot(melt(df), aes(x = variable, y = value)) + 
  geom_point(size = 1, color = "blue") +
  xlab("age") +
  ylab("freq") +
  scale_x_continuous(limits = c(20, 40), breaks=c(20, 25, 30, 35, 40)) +
  scale_y_continuous(limits = c(1, 5)) +
  theme(plot.title = element_text(hjust = 0.5)) +
  theme(axis.text.x=element_text(size=rel(0.7), angle=90))