我的rails应用程序只读取其数据库中的数据。没有保存。 大多数情况下,我的所有观点都是一个包含几个字段的表单来过滤我的搜索,一个表格打印每一列的值。这样的事情:
<table>
<tr>
<th> Col1 </th>
<th> Col2 </th>
<th> Col3 </th>
...
</tr>
<% Model.all.each do |model| %>
<tr>
<td> <%= model.col1 %> </td>
<td> <%= model.col2 %> </td>
<td> <%= model.col3 %> </td>
...
</tr>
<% end %>
超过50个模型,每个模型有10-20个字段,差不多有100个表。这一切都非常简单。
现在我的客户问我,当任何一个单元格为空(数据为空或&#39;)时,他希望它打印&#39; - &#39;而不是桌子上的空白单元
起初我在application_helper.rb上想到了类似的东西:
def avoid_empty(object)
if object == nil or object == ""
return "-"
else
return object
end
end
我的意见无处不在,我只会改变
<%= model.col1 %>
到
<%= avoid_empty(model.col1) %>
但实际上我有2659行。我不确定它是否更健康。
我是否有任何方法可以在每次尝试从这些模型中打印任何值时更改它,我可以先通过该方法或类似的方法,而不必更改我的2659行中的每一行?
答案 0 :(得分:2)
您可以使用ruby的元编程功能和ActiveSupport::Concern
。
创建模型扩展模块以动态覆盖所有列的getter
。下面的代码可以做到这一点:
module ModelExtension
extend ActiveSupport::Concern
# To exclude some columns
EXCLUDE_COLUMNS = ['id', 'created_at', 'updated_at']
included do
(self.column_names - EXCLUDE_COLUMNS).each do |col|
define_method col do
self[col].blank? ? '-' : self[col]
end
end
end
end
在每个模型中加入此模块以获得&#39; - &#39;而不是空白或零。要包含模型,您可以执行以下操作:
class MyModel
include ModelExtension
end
答案 1 :(得分:1)
你可以monkeypatch NilClass
。
class NilClass
def to_s
'-'
end
end
每当您调用nil.to_s
时,它都会打印'-'
。如果您在控制台中键入puts nil
,则会打印-
。请尝试以下示例:
class NilClass
def to_s
'-'
end
end
foo = nil
foo.to_s #=> '-'
puts foo #=> -
在您的情况下,所有出现的空(nil
)属性都会在尝试打印时在视图中输出-
(并且在应用程序的其他部分也会被警告)。
PS。:#to_s
返回表示实例对象的字符串。
答案 2 :(得分:1)
解决方案也许 空对象模式
Null Object是一个具有某些默认行为的对象,它实现与可能在给定大小写中使用的其他对象相同的接口。好的,很酷,但我们如何将其应用于下面的示例?让我们从用户方法开始:
def user
@user ||= User.find_by(email: email) || NullUser.new
end
现在我们可以实现NullUser:
class NullUser
def name
"Anonymous user"
end
end