这个问题是关于在rails 3中使用.try()方法(以及关于测试nil的最佳实践)
如果我有一个db对象可能是也可能不是nil,并且它有一个字段,例如一个分隔的字符串,用逗号和一个可选的分号分隔,我想看看这个字符串是否包含一个特定的子字符串,然后我可能会这样做:
user_page = UserPage.find(id)
if user_page != nil
result = user_page.pagelist.gsub('\;', ',').split(",").include?(sub)
end
所以,例如user_page.pagelist ==“item_a,item_b; item_c”
我想用.try重写这个,但找不到在页面列表后应用这些东西的方法
所以我尝试传递一个块(来自此链接http://apidock.com/rails/Object/try)
user_page.try(:pagelist) {|t| t.gsub('\;', ',').split(",").include?(sub)}
但是,只是忽略该块,返回的结果只是pagelist
我尝试过尝试应用gsub等部分的其他组合,但无济于事
如何将其他方法应用于“尝试过”的方法?
(我甚至不知道如何以可理解的方式表达问题!)
答案 0 :(得分:1)
我认为你可能会遇到这个问题 - 快速解决方案应该是为你的模型添加一个方法:
def formatted_pagelist
(pagelist || "").split(/[;,]/)
end
然后你可以在任何地方使用它:
user_page.formatted_pagelist.include? sub
严格地说,我会说这是一个装饰者。如果你没有在你的应用程序中使用装饰器模式(查看draper!),那么模型方法应该可以正常工作。