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' はおそらく 2 つのメソッドに分割し、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

Ps。Rails のtry方法はあまり好きではありませんが、問題は解決します。

于 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 に答える