restful_authentication: авторизован? = NoMethodError (но logged_in? Работает нормально ...?) - PullRequest
1 голос
/ 18 ноября 2008

Я не понимаю, почему один метод работает, а другой выдает ошибку NoMethodError, если они происходят из одного и того же файла lib.

# app/views/bunnies/show.html.erb
<% if logged_in? %>
  <%= current_user.login %> |
  <%= link_to 'Logout', logout_path %> |
  <% if authorized? %>
    <%= link_to 'Edit Details', edit_bunny_path(@broker) %> |
  <% end %>
  <%= link_to 'Back', bunnies_path %>
<% end %>

... выдает ошибку NoMethodError для authorized?. Если я прокомментирую, что если заблокировать, страница работает нормально (с logged<code>_ in? ).

# lib/authenticated_system.rb
def logged_in?
  !!current_user
end

def authorized?
  current_user.login == "admin"
end

# app/controllers/application.rb
class ApplicationController < ActionController::Base
  include AuthenticatedSystem
end

Что дает?

Ответы [ 3 ]

2 голосов
/ 20 ноября 2008

Я предполагаю, что вы не вошли в систему, когда выдается ошибка. NoMethod не имеет в виду #authorized ?. На самом деле это относится к методу #login current_user. Если вы не вошли в систему, то current_user равен nil, что приводит к NoMethod, когда current_user.login вызывается в #authorized?.

Любой помощник, как уполномоченный? что проверка статуса пользователя должна включать проверку logged_in? Сначала обойти эту проблему. Попробуйте это ...

def authorized?
  logged_in? and current_user.login == "admin"
end

Таким образом, вы выходите из условия, если вы не вошли в систему, и вы не пытаетесь получить доступ к методу #login, если у вас нет доступного объекта.

Вы также можете ознакомиться с некоторыми из доступных схем проверки подлинности на основе ролей, которые работают с Restful_Authentication. Если ваши шаблоны доступа будут более сложными, чем просто проверка администратора, вам будет проще использовать один из этих плагинов.

Кстати, дальше в authenticated_system.rb вы найдете этот код:

# Inclusion hook to make #current_user and #logged_in?
# available as ActionView helper methods.
def self.included(base)
  base.send :helper_method, :current_user, :logged_in?, :authorized? if base.respond_to? :helper_method
end

Это то, что делает методы в этом модуле доступными в качестве вспомогательных методов в представлениях. Если вы добавите метод в authenticated_system.rb, который возвращает статус пользователя (например, что-то вроде #superuser?), Вам нужно будет добавить этот символ метода к вызову base.send в этом коде. Опять же, если вы пишете много кода для контроля доступа, изучение одного из плагинов будет в порядке.

1 голос
/ 20 февраля 2009
def is_admin?
  logged_in? && current_user.login == "admin"
end

достаточно

0 голосов
/ 18 ноября 2008

Точно, так что я до сих пор не понимаю, почему это не работает, но я нашел альтернативное решение.

(1) Оставьте authenticated_system.rb без изменений.

(2) Добавить вспомогательный метод в controllers / application.rb:

helper_method :is_admin?
def is_admin?
  if logged_in? && current_user.login == "admin"
    true
  else
    false
  end
end

(3) Используйте вспомогательный метод вместо authorized?. Если кто-то хотел бы объяснить, почему оригинальный код не работал, я весь в ушах!

(Спасибо этому посту )

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...