好的,我有这个帮手
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存在获取第一个公司名称,如果没有,则获取当前用户公司名称
这有效,但救援似乎是一个黑客......任何想法在另一种方式来实现这个
答案 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