админ?не работает с Mongo Mapper - PullRequest
0 голосов
/ 12 октября 2011

Я пытался поиграть с MongoDb и использовал Rails Tutorial для создания пользователей. Я использую гем Mongo_mapper. У меня все это настроено, но я нахожусь в точке, где кажется, что функции / методы ActiveRecord, похоже, не работают. Все мои тесты работают до этого момента.

У меня есть тумблер! чтобы работать, добавив это в мою модель пользователя, ища источник переключения в APIDock

  def toggle!(field)
    send "#{field}=", !self.send("#{field}?")
    save 
  end

Но когда я пытаюсь использовать эту функцию, чтобы проверить, является ли модель User логической для admin

  def admin?
    self.admin
  end

Я получаю эту ошибку из своего теста.

 1) UsersController DELETE 'destroy' as a non-signed-in user should deny access
     Failure/Error: delete :destroy, :id => @user
     NoMethodError:
       undefined method `admin?' for nil:NilClass
     # ./app/controllers/users_controller.rb:66:in `admin_user'
     # ./spec/controllers/users_controller_spec.rb:253:in `block (4 levels) in <top (required)

Вот что у меня есть для контроллера

class UsersController < ApplicationController
  before_filter :authenticate, :only => [:index, :edit, :update]
  before_filter :correct_user, :only => [:edit, :update]
  before_filter :admin_user,   :only => :destroy
.
.
.  

  def destroy
    User.find(params[:id]).destroy
    flash[:success] = "User deleted."
    redirect_to users_path
  end

  private

    def authenticate
      deny_access unless signed_in?
    end

    def correct_user
      @user = User.find(params[:id])
      redirect_to(root_path) unless current_user?(@user)
    end

    def admin_user
      redirect_to(root_path) unless current_user.admin?
    end

Но я получаю доступ администратора для работы с моим администратором, и я могу удалить пользователя.

<li>
    <%= link_to user.name, user %>
    <% if current_user.admin? %>
        <%= link_to "delete", user, :method => :delete, :confirm => "You sure?",
                                    :title => "Delete #{user.name}" %>
    <% end %>
</li>

Любые предложения о том, как это исправить, так как я застрял на том, как заставить приложение перенаправить после удаления пользователя.

1 Ответ

1 голос
/ 12 октября 2011

Поскольку во время этого теста вы не вошли в систему, current_user равно nil, что является именно той ошибкой, которую вы получаете.

Так что вам нужно обработать случай, когда current_user равен нулю:

def admin_user
  redirect_to(root_path) unless current_user.try(:admin?)
end

Метод try будет обрабатывать случай, когда он вызывается для нулевого объекта. http://api.rubyonrails.org/classes/Object.html#method-i-try

...