2013-03-31 4 views
3
def current_user 
    @_current_user ||= session[:current_user_id] && 
     User.find_by_id(session[:current_user_id]) 
    end 

Является ли @_current_user просто идентификатором или объектом пользователя, найденным по его идентификатору?Какова ценность @_current_user здесь?

ответ

1

Чтобы ответить на ваш вопрос напрямую: объект пользователя, найденный по его идентификатору или nil, если в сеансе нет значения :current_user_id или если для этого идентификатора не существует объекта пользователя.

В принципе, если @_current_user уже установлен, то он не изменит его. В противном случае, он проверяет, существует ли session[:current_user_id] /, и если это по своей природе оператор &&, правая часть возвращается как значение выражения. Правая сторона в основном ищет пользователя с этим current_user_id.

Еще проще: Если @_current_user еще не установлен, то, если сеанс имеет значение current_user_id, он устанавливает @_current_user к User объекту совпадающего идентификатор пользователя.

+0

Небольшая вещь. Почему '@ _current_user' начинается с' _' сразу после '@'? Есть ли какое-нибудь соглашение? – OneZero

+0

@OneZero Nah, это не соглашение, о котором я знаю (в Ruby), но это может быть одно из используемых в приложении, о котором вы говорите. Но да, это просто конвенция, она не имеет особого значения в языке. –

0

Если предположить session[:current_user_id] является 5, то && оператора с моделью пользователя будет возвращать экземпляр пользователя:

> 5 && User.new(:name => 'Foo') 
=> #<User name="Foo"> 

Если обе стороны оператора && является «truthy» (то есть ни один не определены или false) , то значение правой стороны возвращается оператором &&. Таким образом, @_current_user будет экземпляром пользователя.

Смежные вопросы