有没有更多的红宝石方式这样做

时间:2012-05-10 20:13:21

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

好的,我有这个帮手

def current_company_title
 (Company.find_by_id(params["company_id"]).name rescue nil) || (@companies.first.name rescue nil) current_user.company.name
end

基本上我所取得的成就如下......

如果param [“company_id”]存在,那么尝试获取公司,如果不存在则 如果@companies存在获取第一个公司名称,如果没有,则获取当前用户公司名称

这有效,但救援似乎是一个黑客......任何想法在另一种方式来实现这个

6 个答案:

答案 0 :(得分:3)

确实救援有点像黑客,id'可能会将其分成两种方法,然后使用try获取名称({3}}

def current_company
  @current_company ||= Company.find_by_id(params[:company_id]) || @companies.try(:first) || current_user.try(:company)
end

def current_company_name
  current_company.try(:name)
end

答案 1 :(得分:2)

少“神奇”,简单的代码,易于阅读:

def current_company_title
 company = Company.where(id: params["company_id"]).presence
 company ||= @companies.try(:first)
 company ||= current_user.company
 company.name
end

聚苯乙烯。不是Rails'try方法的忠实粉丝,但它解决了这个问题。

答案 2 :(得分:2)

Company.find_by_id(params["company_id"]).name`

find及其衍生词是在您确定 - 您将获得肯定结果时使用,并且仅在某些情况下(行被删除等)错误时使用。这就是它引发异常的原因。在你的情况下,你假设它会失败,所以常规where,如果没有找到行将返回nil,会做得更好,并删除第一个rescue

@companies.first.name rescue nil

可以替换为

@companies.first.try(:name)

我会让你检查api,了解更多有关try主题的信息。它不是常规的红宝石,而是Rails的补充。

答案 3 :(得分:1)

def current_company_title
    if params["company_id"]
        return Company.find_by_id(params["company_id"]).name
    elsif @companies
        return @companies.first.name
    else
        return current_user.company.name
    end
end

答案 4 :(得分:1)

救援 是一个黑客行为,并且如果发生其他错误,则会掩盖这些错误。

试试这个:

(Company.find_by_id(params["company_id"].name if Company.exists?(params["company_id"]) ||
(@companies.first.name if @companies && @companies.first) || 
current_user.company.name

然后你可以将每个括号内的条件提取到他们自己的方法中,使其更具可读性,并且更容易调整条件:

company_name_from_id(params["company_id"]) || name_from_first_in_collection(@companies) || current_user_company_name

def company_name_from_id(company_id)
  company=Company.find_by_id(company_id)
  company.name if company
end

def name_from_first_in_collection(companies)
  companies.first.name if companies && companies.first
end

def current_user_company_name
  current_user.company.name if current_user.company
end

答案 5 :(得分:0)

[Company.find_by_id(params["company_id"]),
  @companies.to_a.first,
  current_user.company
].compact.first.name