在视图中扩展html类的推荐模式是什么?

时间:2012-12-25 02:05:26

标签: ruby-on-rails ruby ruby-on-rails-3 helpers

我的表格中有<tr>个标记

<% if user.company.nil? %>
  <tr class="error">
<% else %>
  <tr>
<% end %>
  <td><%= user.name %></td>
</tr>

我想添加另一个if语句

<% if user.disabled? %>
  <tr class="disabled">
<% end %>

所以当我的两个陈述是true时,我希望收到:

<tr class="error disabled">

我知道我应该把它移到帮手那么如何为扩展类编写好的案例陈述取决于这些陈述?

2 个答案:

答案 0 :(得分:2)

def tr_classes(user)
  classes = []
  classes << "error" if user.company.nil?
  classes << "disabled" if user.disabled?
  if classes.any?
    " class=\"#{classes.join(" ")}\""
  end
end

<tr<%= tr_classes(user) %>>
  <td><%= user.name %></td>
</tr>

但好的风格是:

def tr_classes(user)
  classes = []
  classes << "error" if user.company.nil?
  classes << "disabled" if user.disabled?
  if classes.any?   # method return nil unless
    classes.join(" ")
  end
end

<%= content_tag :tr, :class => tr_classes(user) do -%> # if tr_classes.nil? blank <tr>
  <td><%= user.name %></td>
<% end -%>

答案 1 :(得分:0)

您可以尝试一种辅助方法,例如

def user_table_row(user)
  css = ""
  css = "#{css} error" if user.company.nil?
  css = "#{css} disabled" if user.disabled?

  content_tag :tr, class: css
end

不确定这对于表格行的效果如何,因为你想在其中嵌套td

UPDATE:这里是更新版本,产生了td代码块

def user_table_row(user)
  css = # derive css, using string or array join style

  options = {}
  options[:class] = css if css.length > 0

  content_tag :tr, options do
    yield
  end
end

然后在视图中

<%= user_table_row(user) do %>
  <td><%= user.name %></td>
<% end %>