在Rails中的标签内引用

时间:2009-09-23 09:50:42

标签: ruby-on-rails

好的,我正在研究我的小项目的观点。每天我都会这样做:

<li <%= 'class="'+item.status.caption+'"' if %w{ sold, absent }.include?(item.status.caption) %> >

最近,我在Ruby API中找到了一个合适的String方法,名为 quote 。 我写了这个:

<li <%= 'class='+item.status.caption.quote if %w{ sold, absent }.include?(item.status.caption) %> >

但是应用程序丢失了一个错误,说它无法识别该方法。那么,是否有适当的方法来进行这种通常的引用(或者,甚至是“自定义符号/字符串的'ththination':P)?像'surround_with'之类的东西?没有在Rail API中找到线索。

5 个答案:

答案 0 :(得分:2)

这在视图中的逻辑太多了,而你没有使用Rails给你的助手。在app/helpers中的 foo_helper.rb 文件中创建一个方法(其中'foo'是您的控制器名称):

def display_item(item)
  case item.status.caption
    when /sold/ then class = 'sold'
    when /absent/ then class = 'absent'
    else class = nil  # You could add more cases here as needed
  end
  content_tag :li, item.name, :class => class  # Or whatever you want shown
end

然后,在您看来,您可以致电<%= display_item(item) %>而不是所有嵌入式if乱码。

(哦,这不是你的问题,但作为一项额外的练习,还要考虑如何使用item.status.captionitem.sold?等方法减少item.absent?链接。通过将status转换为可以直接测试的内容。谷歌在“Demeter法则”中找出为什么这是一个好主意。)

答案 1 :(得分:1)

您还可以创建一个非常简单的帮助程序,例如:

  def quoted_class(val)
    "class='#{val}'"
  end

然后你会在你的例子中使用它,如下:

<li <%= quoted_class(item.status.caption) if %w{s,abs}.include?(item.status.caption) %>>

答案 2 :(得分:1)

或者您可以使用content_tag?你没有说明你在li中展示了什么,但你可以做类似的事情:

<%= content_tag :li, "your list content", ({:class => item.status.caption} if %w{ sold absent }.include?(item.status.caption)) %>

顺便说一句,我认为你不想在%w字符串中使用逗号,除非你真的想要与“已售出”(用逗号)或“缺席”匹配。

答案 3 :(得分:0)

要使用引号,我会做这样的事情:

"This is '#{string_inside_quotes}'."

或者

"This is \"#{string_inside_quotes}\"."

虽然我不太清楚你在原始例子中的意思。

答案 4 :(得分:0)

为什么不

<li class="<%= item.status.caption if %w{ sold, absent }.include?(item.status.caption) %>">

作为一个空类属性就像没有类属性一样?

如果你不想逃避你的报价,还有另一种引用ruby的方法:

<li <%= %q(class="#{item.status.caption}") if %w{ sold, absent }.include?(item.status.caption) %>>