неопределенный метод `root?' для нуля: NilClass

У меня есть некоторое дерево категорий, построенное с использованием драгоценного камня Ancestry для Rails 3. Я могу использовать все методы Ancestry между консолью и другими контроллерами. Но теперь я столкнулся с проблемой использования таких методов, как root? а есть_рут? Чтобы определить, является ли выбранный кот корневой категорией.

Мой код внутри контроллера приложений

private
def set_categories
  def set_ids
    case action_name
    when "index"

   @origin_cat = Category.find_by_name(params[:category])

    if @origin_cat.root?
    @descendant_ids = @origin_cat.descendant_ids
    @descendant_prods = Product.where(:category_id => @descendant_ids  ).paginate(:per_page=>10, :page=> params[:page])
else

    end

......

Моя ошибка выглядит так:

undefined method `root?' for nil:NilClass

person Edgars    schedule 29.04.2014    source источник
comment
сделайте p params, чтобы увидеть, имеет ли ключ :category какое-либо значение или нет.   -  person Arup Rakshit    schedule 29.04.2014
comment
Category.find_by_name(params[:category]) ничего не дало.   -  person lurker    schedule 29.04.2014
comment
В вашем вызове .root? нет ничего плохого; проблема в том, что @origin_cat равно нулю, потому что поиск не удался. Вы должны проверить значение params[:category]   -  person    schedule 29.04.2014


Ответы (2)


Сначала вы должны проверить, не является ли @origin_cat nil, а затем является ли @origin_cat.root? истинным или нет, как показано ниже:

   @origin_cat = Category.find_by_name(params[:category])

  if @origin_cat && @origin_cat.root?
    @descendant_ids = @origin_cat.descendant_ids
    @descendant_prods = Product.where(:category_id => @descendant_ids  ).paginate(:per_page=>10, :page=> params[:page])
  else

  end

или вы можете просто сделать:

  if @origin_cat.try(:root?)

С помощью try, даже если @origin_cat равно nil, он просто вернет nil, а не выдаст ошибку.

Подробнее о попытке здесь.

person Saurabh    schedule 29.04.2014

Ваш @origin_cat равен nil. Убедитесь, что значение params[:category] не равно nil

if @origin_cat.present? && @origin_cat.root?
    @descendant_ids = @origin_cat.descendant_ids
    @descendant_prods = Product.where(:category_id => @descendant_ids).paginate(:per_page=>10, :page=> params[:page])
else

end
person Pavan    schedule 29.04.2014
comment
Зачем ему использовать unless так, как ты? Он имеет противоположное if логическое значение, так что теперь этот код будет работать только в том случае, если он НЕ root. Это также не решает исключение, когда @origin_cat равно nil. По сути, вы меняете его намерение с if @origin_cat.root? на if not @origin_cat.root?. - person Daniël Knippers; 29.04.2014
comment
Это все еще будет давать ту же ошибку. Также изменяет логику ОП. - person Kirti Thorat; 29.04.2014
comment
@KirtiThorat, упс, отредактировано! - person Pavan; 29.04.2014
comment
@DaniëlKnippers Извинения. Используется, если только не в неправильной ситуации. Обновлено. Взгляните на это. - person Pavan; 29.04.2014
comment
@KirtiThorat Спасибо :) - person Pavan; 29.04.2014
comment
@Pavan Да, теперь лучше. На самом деле я не минусовал вас, но, поскольку вы исправили это сейчас, +1. Я вижу, что другие удалили свой отрицательный голос. - person Daniël Knippers; 29.04.2014