上記の素晴らしい回答がありますが、同じメソッドを書く別の方法を提案させてください...:
# by the way, I would change the name of the method, as cart isn't a property of the controller.
def cart
# Assume that `current_user` returns nil or false if a user isn't logged in.
@user = current_user
# The following || operator replaces the if-else statements.
# If both fail, @cart will be nil or false.
@cart = (@user && @user.cart) || ( session[:cart_id] && Cart.find(session[:cart_id]) )
end
ご覧のとおり、 if ステートメントが無駄になる場合があります。メソッドが「失敗」したときに何を返すかを知ることで、コードの記述が読みやすく、維持しやすくなります。
補足として、ステートメントを理解するために、次の点に注意||
してください。
"anything" && 8 # => 8 # if the statements is true, the second value is returned
"anything" && nil && 5 # => nil # The statement stopped evaluating on `nil`.
# hence, if @user and @user.cart exist:
@user && @user.cart #=> @user.cart # ... Presto :-)
幸運を!
PS
このための Cart クラスにメソッドを書くことを検討します (または、この Controller ロジックはあなたの意見ですか?):
# in cart.rb
class Cart
def self.find_active user, cart_id
return user.cart if user
return self.find(cart_id) if cart_id
false
end
end
# in controller:
@cart = Cart.find_active( (@user = current_user), session[:cart_id] )