2013-04-18 8 views
1

В каталоге /views/layouts, как мне получить текущего пользователя? Я использую Devise, но current_user не работает здесь по какой-то причине, он описывает его как неизвестный метод. Я хочу сделать что-то вроде:Попытка получить «текущего пользователя» в Rails

<% if User.role? == "gen_admin" %> 
    <li> 
    <%= link_to('Admin', users) %> 
    </li> 
<% end %> 

У меня есть метод role? определены в моей модели пользователя, но я все еще получаю это исключение:

undefined method 'role?' for #<Class:0x3fcc1e0>

Так как я могу получить текущий пользователь , и получить доступ к своим полям на этом уровне исходного дерева? Благодаря!

Вот роли? Метод:

# in User 
ROLES = %w[gen_admin teacher_admin student] 
def role?(base_role) 
    ROLES.index(base_role.to_s) <= ROLES.index(role) 
end 
+0

вы можете предоставить код для метода 'роль?' – Lian

+0

хорошо я добавил метод пользователя – Houdini

+1

попытаться поставить 'self' так, что она стала как этот определение функции self.role? (Base_role) ROLES.index (base_role.to_s) <= ROLES.index (роль) end' – Lian

ответ

5

Ваш код должен учитывать, когда пользователи вошли в систему, и когда они не вошли в

Если пользователь не авторизован, то current_user возвратит ноль (как в вашем случае, который, по вашему мнению, был ошибкой в ​​отношении Девиза).

Ваш код вида должен обрабатывать это - например.

<% if current_user.present? && current_user.role?('gen_admin') %> 
+0

Хорошо, так что я прошел мимо ноля: жалоба объекта. Спасибо за информацию тоже, я не знал, что вам нужно было учитывать, что пользователь не был зарегистрирован явно. Но теперь он говорит: 'неправильное количество аргументов (2 для 1)', ссылаясь на роль? метод, я считаю. Есть идеи по этому поводу? – Houdini

+0

Никогда, я должен был взять «я» из роли? по какой-то причине. Спасибо за вашу помощь! – Houdini

2

Вы определили свой метод role? как метод экземпляра. Это означает, что для того, чтобы использовать его, вы должны сначала создать экземпляр из User класса, например:

@user=User.new 

Теперь вы можете позвонить @user.role?

Если вы хотите role? быть доступны через модель User, то вы должны определить это как метод класса проход в объекте для проверки

def self.role?(user) 

... 

end 
+1

Кто бы ни задумал это без всякой причины, объясните себя в этом комментарии. – IKA

+0

не уверен, но я снова его поддержал. люди иногда бывают странными на этом сайте. ваш ответ был не тем, что мне нужно было точно, но это могло бы помочь кому-то другому. – Houdini

+0

спасибо за поддержку Гудини! Возможно, я неверно истолковал ваш вопрос. Если вы решите свою проблему, чем я счастлив за вас, если нет, можете ли вы немного расширить ее? – IKA

-1

вы забыли добавить before_filter :authenticate_user! в контроллере? Это гарантирует, что current_user доступен в ваших взглядах

+0

Нет, он гарантирует, что пользователь должен войти в систему для доступа к текущему действию. – sevenseacat

+0

Мой ответ может быть неясным, но я думаю, что это правильно, потому что, если вы не используете ': authenticate_user!' В своем контроллере, любой доступ к 'current_user' в представлениях с этого контроллера будет неправильным, я прав? Можем ли мы по-прежнему использовать 'current_user' без': authenticate_user! '? –

+1

Да, вы можете использовать 'current_user'. Не заставлять логин не означает, что пользователь не может войти в систему. – sevenseacat

1

Вам нужно изменить код на ваш взгляд, использовать current_user, а не User, а также корректно не вызвать метод role? (без ==). Если это используется в представлении, доступ к которому может получить не зарегистрированный пользователь, вы должны подтвердить, что пользователь вошел в систему первым (поэтому вы не пытаетесь вызвать role? на nil, что вызовет исключение).

<% if current_user && current_user.role?("gen_admin") %> 
    <li> 
    <%= link_to('Admin', users) %> 
    </li> 
<% end %> 
+0

Нет, вам не нужно вызывать 'authenticate_user', чтобы установить current_user. – sevenseacat

+0

Прохладный, не использовал Разработать себя, поэтому я не был уверен. Удалил эту часть моего ответа. Остальная часть ответа стоит, хотя я предполагаю, что ваше использование '.present? 'Немного более основательно (есть ли вероятность, что' current_user' вернет объект 'empty'?). –

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