将块传递给.try()

时间:2013-07-10 21:09:23

标签: ruby-on-rails-3

这个问题是关于在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等部分的其他组合,但无济于事

如何将其他方法应用于“尝试过”的方法?

(我甚至不知道如何以可理解的方式表达问题!)

1 个答案:

答案 0 :(得分:1)

我认为你可能会遇到这个问题 - 快速解决方案应该是为你的模型添加一个方法:

def formatted_pagelist
  (pagelist || "").split(/[;,]/)
end

然后你可以在任何地方使用它:

user_page.formatted_pagelist.include? sub

严格地说,我会说这是一个装饰者。如果你没有在你的应用程序中使用装饰器模式(查看draper!),那么模型方法应该可以正常工作。