I was trying to play with MongoDb and using the Rails Tutorial to create users. I'm using the Mongo_mapper gem. I have that all set up but I'm at the point where it seems that ActiveRecord functions/methods don't seem to work. All my tests work til this point.
I got toggle! to work by adding this to my user model by looking up the toggle source in APIDock
def toggle!(field)
send "#{field}=", !self.send("#{field}?")
save
end
But when I try this function to see if the User model boolean of admin
def admin?
self.admin
end
I get this error from my test.
1) UsersController DELETE 'destroy' as a non-signed-in user should deny access
Failure/Error: delete :destroy, :id => @user
NoMethodError:
undefined meth开发者_高级运维od `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)
Here's what I have for the controller
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
But I do get admin access to work with my admin user and I'm able to delete the user.
<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>
Any suggestions on how to fix this as I'm stuck on how to get the app to redirect after deleting a user.
Since you dont have a logged in user during that test, current_user
is nil
, which is exactly the error you are getting.
So you need to handle the case where current_user
is nil:
def admin_user
redirect_to(root_path) unless current_user.try(:admin?)
end
The try
method will handle the case where it is called on a nil object. http://api.rubyonrails.org/classes/Object.html#method-i-try
精彩评论