2

好的,所以我有这个帮手

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 存在,则获取第一个公司名称,如果不存在,则获取当前用户的公司名称

这行得通,但救援似乎是一种黑客行为......任何关于另一种方式来实现这一目标的想法

4

6 回答 6

3

确实救援是一种黑客,id'可能将其分成两种方法,然后用于try获取名称(如果可用): http: //api.rubyonrails.org/classes/Object.html#method-i-try

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
于 2012-05-10T20:19:13.873 回答
2

少“魔法”,简单代码,简单易读:

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

附言。不是 Railstry方法的忠实拥护者,但它解决了问题。

于 2012-05-10T20:20:25.343 回答
2
Company.find_by_id(params["company_id"]).name`

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

@companies.first.name rescue nil

可以替换为

@companies.first.try(:name)

我会让你检查 api 以了解更多关于try. 它不是普通的 ruby​​,它是 Rails 的补充。

于 2012-05-10T20:21:06.077 回答
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
于 2012-05-10T22:47:55.633 回答
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
于 2012-05-10T20:34:33.757 回答
0
[Company.find_by_id(params["company_id"]),
  @companies.to_a.first,
  current_user.company
].compact.first.name
于 2012-05-10T20:17:08.337 回答