Ошибка nil при использовании paginate с условиями в контроллере

Я получил эту ошибку "неопределенный метод "paginate" для nil: NilClass"

Вот моя таблица:

 policies
   id   num_policy   type_id    doc    name
    1        2323      1       181844  Charles
    2        2121      2       151511  Aguardientico
    3        3423      2       434344  Benjamin

Вот мой контроллер:

if params[:num_policy].present?
  @search= Policy.find(:all,:conditions=>['num_policy LIKE ?',params[:num_policy] ])
end

if params[:type_id].present?
  @search= Policy.find(:all,:conditions=>['type_id LIKE ?',params[:type_id] ])
end

if params[:doc].present?
  @search= Policy.find(:all,:conditions=>['doc LIKE ?',params[:doc] ])
end

if params[:name].present?
  @search= Policy.find(:all,:conditions=>['name LIKE ?',params[:name] ])
end

if params[:doc].present? and params[:type_id].present?
  @search= Policy.find(:all,:conditions=>['doc LIKE ? and type_id LIKE ?',params[:doc],params[:type_id] ])
end

@policies= @search.paginate( :page => params[:page], :per_page =>2)

вот мой взгляд

 <% @policies.each do |p| %>
   <%= p.num_policy %>
   <%= p.type_id %>
   <%= p.doc %>
   <%= p.name %>
 <% end %>

Но если удалить paginate, я получил эту ошибку: «У вас есть нулевой объект, когда вы этого не ожидали! Возможно, вы ожидали экземпляр Array. Ошибка произошла при оценке nil.each»

 #controller
 @policies= @search

 #says that my line  <% @policies.each do |p| %>  is nil

Мои условия, кажется, не работают с разбиением на страницы

А еще я пробовал

 <% @search.each do |p| %>
   <%= p.num_policy %>
   <%= p.type_id %>
   <%= p.doc %>
   <%= p.name %>
 <% end %>

Я нашел это, используя условия, но не знаю, как его использовать

        # define what are the search keys that can be found in params[]
        search_keys = [:a, :b, :c, :d, :e, :f]

        # extract hash values that concern only the search criteria
        search_params = params.select { |k,v| search_keys.include? k and ! v.nil? and ! v.empty? }

        # Write query according to search criteria presents
        case search_params.keys.sort
          when [:a]
            # Write the query when only :a search criteria is present
            Something.where("blahblah = ?", params[:a])
          when [:a, :c]
            # Write the query when only :a and :c search criteria are present
            Something.where("a_field = ? AND stuff = ?", params[:a], params[:c])
          when ...
            ...
        end

Пожалуйста, кто-нибудь может помочь мне с этим?

Я буду очень признателен за помощь.


person Carlos Morales    schedule 22.11.2013    source источник


Ответы (2)


Вы получаете ошибки в обоих случаях, независимо от того, используете ли вы paginate или нет.

Похоже, что ваш @search равен нулю (не попал ни в один оператор if), который инициализировал @policies с nil. Следовательно, он не смог найти paginate на NilClass.

Обновление: добавьте строку

@search = Policy.all if @search.nil? 

or

@search ||= Policy.all

чуть выше строки @policies= @search.paginate( :page => params[:page], :per_page =>2).

Это подтвердит этот прогноз.

person kiddorails    schedule 22.11.2013
comment
Ну, я попробовал @search и тоже не работает, кажется, что УСЛОВИЯ что-то БЛОКИРУЮТ - person Carlos Morales; 23.11.2013
comment
Да. Сделайте это: добавьте строку @search = Policy.all if @search.nil? (для отладки) чуть выше строки @policies= @search.paginate( :page => params[:page], :per_page =>2) и попробуйте. - person kiddorails; 23.11.2013
comment
хорошо, я попробовал @search= Policy.find(:all) А также @policies= @search.paginate(:page =› params[:page], :per_page =›2) и работает. Но не работает с условиями, которые я хочу - person Carlos Morales; 23.11.2013
comment
Для этого вам нужно будет проверить свои условия и требования. Попробуйте выполнить отладку с некоторыми вариантами использования. Мы не сможем помочь с вашими вариантами использования :) - person kiddorails; 23.11.2013
comment
Большой!!! фантастическое спасибо за вашу помощь. Мне нужно только @search = Policy.all, если @search.nil? чтобы понял =) .Спасибо kiddorails - person Carlos Morales; 23.11.2013

На ваш взгляд, я думаю, что вместо политик следует использовать @policies.

person kddeisz    schedule 22.11.2013