2013-09-24 1 views
0


Я следующие два метода в моей CommandsControllerэкземпляр переменного Rails

class CommandsController < ApplicationController 
. 
. 
. 

def userslist 
    @command = Command.find_by(id: params[:id]) 
    @users_list = @command.users.paginate(page: params[:page], per_page: 10) 
end 

def deleteuser 
    user = User.find_by(id: params[:id]) 
    user.commands.destroy(@command) 
    flash[:success] = "Utente eliminato dalla lista con successo" 
    redirect_to list_path(@command) 
end 
. 
. 
. 

end 

Когда я исполню метод deleteuser я получаю следующее сообщение об ошибке:
Command(#31369720) expected, got NilClass(#19349600) связанных с выстилаю user.commands.destroy(@command) , что означает, что @command равен нулю , но почему это так? Не @command переменная экземпляра, видимая всеми методами в моем классе?


P.S. Чтобы вызвать метод deleteuser, мне нужно пройти через метод userslist, поэтому @command, конечно, не ноль.

+0

@command не могут быть доступны для метода deleteuser. вам нужно снова объявить – Debadatt

+0

, но почему не удается @command быть доступным? это переменная экземпляра, не так ли? – zer0uno

ответ

3

Ваша переменная экземпляра @command не установлена, когда вы вызываете метод deleteuser, поэтому он оценивает nil.

Причина, по которой у вас возникла эта ошибка, вы, вероятно, неправильно понимаете, как работают контроллеры Rails. Rails создает новый экземпляр вашего контроллера команд с каждым запросом относительно этого контроллера, поэтому даже если в предыдущем действии задана переменная экземпляра @command, с новым запросом снова будет nil.

Я предлагаю изучить некоторые основы и соглашения Rails/Ruby (включая соглашения об именах).

+0

, но этот параметр определяется методом userslist ранее – zer0uno

+0

@antox Я изменил свой вопрос, если быть более точным. –

0

Вы можете сделать еще один частный способ объявить @command и назвать его в before_filter после объявления класса контроллера