Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Исправить ошибку, nil.empty 
V
    Опции темы
Лена
Дата 29.12.2009, 11:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 879
Регистрация: 16.8.2006

Репутация: нет
Всего: 11



В строке поиска ввожу наименование и нажимаю поиск. Контроллер поиска вглядит так:
Код

def find_tovar
     param = params[:title] 
      if param.empty?
        redirect_to_index("Введите название товара")
      end
        
        page = params[:page].to_i
        @tovary   = Product.paginate :page => (page==0 ? 1 : page), :order => 'title', :per_page => 10, :conditions => ["title like ?", "#{param}%"] 

      if @tovary.empty?
         redirect_to_index("Указанного товара нет") 
       end
end


Поиск срабатывает, но при переходе на другую страницу среди найденных товаров получаю:
You have a nil object when you didn't expect it!
You might have expected an instance of Array.
The error occurred while evaluating nil.empty?

Анализ показал, что чтобы код работал надо заккоментировать:
 #if param.empty?
        #redirect_to_index("Введите название товара")
 #end

Есть ли возможность оставить провеку? Как переделать код в таком случае?

Да и вообще мой код не корректен. Ведь есди пользователь переходит на вторую страницу в найденных товарах то и param уже получается пустой. Следовательно и поиск уже не правильно работает.  smile 


Код

<% form_tag :action => :find_tovar, :method => 'get' do  %>
 <table cellpadding="0" cellspacing="0">  
  <tr><td>
  <label for ="title">Поиск:</label><td/><td></td><tr>
  <tr><td>
  <%= text_field_tag :title, '', :size=>15 %><td/><td>
  <%= image_submit_tag("find.png") %>
  </td><tr>
 </table>
 <% end %>




Т.е. допустим у меня 12 товаров на букву С 
Если я ввожу эту букву и нажимаю поиск я получаю две страницы. На первой 10 товаров на букву С. При переходе на вторую страницу я попадаю на первую страницу всего каталога. smile 


Это сообщение отредактировал(а) Лена - 29.12.2009, 13:07
PM MAIL   Вверх
source777
Дата 29.12.2009, 13:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1878
Регистрация: 12.3.2007

Репутация: 12
Всего: 56



используй blank? вместо empty? или (param.nil? || param.empty?)


--------------------
Если бы программистам платили за то, чтобы убирать код из программы вместо того, чтобы добавлять его, программы были бы намного лучше © Николас Негропонте
PM MAIL   Вверх
Лена
Дата 29.12.2009, 13:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 879
Регистрация: 16.8.2006

Репутация: нет
Всего: 11



Цитата(source777 @  29.12.2009,  13:19 Найти цитируемый пост)
используй blank?



Порльзователь в строке поиска ставит букву С и жмет поиск:
Код

<% form_tag :action => :find_tovar, :method => 'get' do  %>
 <table cellpadding="0" cellspacing="0">  
  <tr><td>
  <label for ="title">Поиск:</label><td/><td></td><tr>
  <tr><td>
  <%= text_field_tag :title, '', :size=>15 %><td/><td>
  <%= image_submit_tag("find.png") %>
  </td><tr>
 </table>
 <% end %>



Допустим товаров 15 штук.

Выполняется действие:
Код

def find_tovar
     param = params[:title] 
      if param.blank?
        redirect_to_index("Введите название товара")
      end
        page = params[:page].to_i
        @tovary   = Product.paginate :page => (page==0 ? 1 : page), :order => 'title', :per_page => 10, :conditions => ["title like ?", "#{param}%"] 

      if @tovary.empty?
         redirect_to_index("Указанного товара нет") 
       end
end


После выполнения действия пользователь видит страницу с первыми 10 товарами на букву С. Если пользователь захочет увидеть остальный 5 товаров на букву С, он жмет внизу переход на вторую страницу.
 
Вместо того чтобы их увидеть, пользователь почему-то попадает назад в полный католг всех товаров.
Плюс еще и видит не нужное ("Введите название товара")
 smile 


Допустим я убираю этот код вообще:
   if param.blank?
        redirect_to_index("Введите название товара")
      end

Остается вопрос почему я не могу увидеть вторую страницу, а попадаю назад в каталог.


Чтобы понять, что происходит можно зайти на мой сайт. Посмотреть сколько товаров в общем каталоге на букву С. Их 12.
Ввожу букву С и жму поиск. Вижу две страницы. При переходе на вторую страницу меня кидает обратно в полный каталог. 

А в категориях работает нормально. Код в категориях такой:

Код

def find_tovar_cat
 
      param = params[:category] 
      
      page = params[:page].to_i
      @tovary2   = Product.paginate :page => (page==0 ? 1 : page), :order => 'title', :per_page => 10, :conditions => ["category like ?", "#{param}%"] 
 
      
      if @tovary2.empty?
         redirect_to_index("Таких товаров нет") 
       end
 end




Разница только в инициализации param...

и вызов другой:
<%= link_to 'Аминокислоты', :action => 'find_tovar_cat', :category=>'Аминокислоты'%>



Это сообщение отредактировал(а) Лена - 29.12.2009, 14:00
PM MAIL   Вверх
source777
Дата 29.12.2009, 17:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1878
Регистрация: 12.3.2007

Репутация: 12
Всего: 56



Ссылки, генерируемые will_paginate, покажи.


--------------------
Если бы программистам платили за то, чтобы убирать код из программы вместо того, чтобы добавлять его, программы были бы намного лучше © Николас Негропонте
PM MAIL   Вверх
Лена
Дата 29.12.2009, 17:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 879
Регистрация: 16.8.2006

Репутация: нет
Всего: 11



Цитата(source777 @  29.12.2009,  17:25 Найти цитируемый пост)
Ссылки, генерируемые will_paginate, покажи. 


Это общий поиск:
<div class=pagination><%= will_paginate @tovary  %></div> 

Это поиск по категориям:
<div class=pagination><%= will_paginate @tovary2  %></div>


Я так понимаю, то при переходе на вторую страницу param в строке поиска становить пустым и поэтому сюда при заходе на вторую страницу передается пустота:
@tovary   = Product.paginate :page => (page==0 ? 1 : page), :order => 'title', :per_page => 10, :conditions => ["title like ?", "#{param}%"]   <- param пустой и поэтому выводиться весь каталог.
Или в чем проблема?



PM MAIL   Вверх
source777
Дата 29.12.2009, 18:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1878
Регистрация: 12.3.2007

Репутация: 12
Всего: 56



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


--------------------
Если бы программистам платили за то, чтобы убирать код из программы вместо того, чтобы добавлять его, программы были бы намного лучше © Николас Негропонте
PM MAIL   Вверх
Лена
Дата 29.12.2009, 19:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 879
Регистрация: 16.8.2006

Репутация: нет
Всего: 11



Цитата(source777 @  29.12.2009,  18:08 Найти цитируемый пост)
Да не код, сами ссылки покажи, которые в результате выполнения этого кода получаются. 


Я прошу прощения какие ссылки? Те что в окне браузера после выполнения кода? Если да то:
Ввожу букву С в окне поиска. Жму найти - попадаю на ссылку: http://maximumshop.msk.su/store/find_tovar?method=get вижу товары на букву С
если перейти на вторую страницу товара то ссылка становиться: http://maximumshop.msk.su/store/find_tovar?page=2 при этом попадаю на начало перечня всех товаров а не на вторую страницу с товарами на букву С.

Если искать по категориям, где все нормально работает то у  категорий такие ссылки:
http://maximumshop.msk.su/store/find_tovar_cat?category=%D0%90%D0%BC%D0%B8%D0%BD%D0%BE%D0%BA%D0%B8%D1%81%D0%BB%D0%BE%D1%82%D1%8B

http://maximumshop.msk.su/store/find_tovar_cat?category=%D0%90%D0%BC%D0%B8%D0%BD%D0%BE%D0%BA%D0%B8%D1%81%D0%BB%D0%BE%D1%82%D1%8B&page=2


Это сообщение отредактировал(а) Лена - 29.12.2009, 19:06
PM MAIL   Вверх
source777
Дата 29.12.2009, 20:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1878
Регистрация: 12.3.2007

Репутация: 12
Всего: 56



Цитата(Лена @  29.12.2009,  19:03 Найти цитируемый пост)
http://maximumshop.msk.su/store/find_tovar?method=get


Что это за хрень? У тебя у формы должен быть атрибут method, а не в action доп. параметр. 

Попробуй:
Код

<% form_tag :action => :find_tovar, :html => {:method => 'get'} do  %>



--------------------
Если бы программистам платили за то, чтобы убирать код из программы вместо того, чтобы добавлять его, программы были бы намного лучше © Николас Негропонте
PM MAIL   Вверх
Лена
Дата 29.12.2009, 21:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 879
Регистрация: 16.8.2006

Репутация: нет
Всего: 11



Цитата(source777 @  29.12.2009,  20:30 Найти цитируемый пост)
<% form_tag :action => :find_tovar, :html => {:method => 'get'} do  %>


Ничего не изменилось. Вводим букву С и жмем поиск. Первая страница нормальная все товары на букву С. Ссылка стала такой: http://maximumshop.msk.su/store/find_tovar?html%5Bmethod%5D=get

При нажати на вторую страницу пагинатора снова отображается весь католог и ссылка такая: 
http://maximumshop.msk.su/store/find_tovar?page=2


PM MAIL   Вверх
source777
Дата 29.12.2009, 21:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1878
Регистрация: 12.3.2007

Репутация: 12
Всего: 56



ты до сих пор не обновила Rails?

Код

<% form_tag {:action => :find_tovar}, {:method => 'get'} do  %>


Это сообщение отредактировал(а) source777 - 29.12.2009, 21:53


--------------------
Если бы программистам платили за то, чтобы убирать код из программы вместо того, чтобы добавлять его, программы были бы намного лучше © Николас Негропонте
PM MAIL   Вверх
Лена
Дата 29.12.2009, 22:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 879
Регистрация: 16.8.2006

Репутация: нет
Всего: 11



Большое спасибо! smile 
 <% form_tag ({:action => :find_tovar}, {:method => 'get'}) do  %> заработало.

У меня старая версия Ror заморожена в vendor. Я только обновила gem для установки нового пагинатора. Ошибка стала заметной только тогда, когда появилось несколько страниц пагинатора. 

Проект был практически закончен и я побоялась из-за отсутсвия опыта обновить в нем Rails т.к. предпологала большое кол-во ошибок в старом коде после обновления.   smile

Новый проект начну с самой последней версии rails.  smile  
PM MAIL   Вверх
source777
Дата 29.12.2009, 23:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1878
Регистрация: 12.3.2007

Репутация: 12
Всего: 56



Цитата(Лена @  29.12.2009,  22:32 Найти цитируемый пост)
Проект был практически закончен

Т.е. поддерживать и развивать его ты не собираешься?


Цитата(Лена @  29.12.2009,  22:32 Найти цитируемый пост)
побоялась из-за отсутсвия опыта обновить в нем Rails т.к. предпологала большое кол-во ошибок в старом коде после обновления. 

Ну так а как ты этот опыт собираешься приобретать? Раз уж ты изучила старую версию, то у тебя есть всего 2 пути:
1) обновить уже работающий проект до свежей версии RoR и уяснить различия, путём гугления по сообщениям возникнувших ошибок.
2) изучать новую версию RoR с нуля.


--------------------
Если бы программистам платили за то, чтобы убирать код из программы вместо того, чтобы добавлять его, программы были бы намного лучше © Николас Негропонте
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Ruby on Rails"
source777
  • С чего начать? начинаем
  • Документацию смотрим тут
  • Обязательно следуйте правилам Vingrad.
  • Пожалуйста, прочитайте рекомендации по работе в форуме и навигации по Vingrad.
  • Для вставки кодов Ruby используйте тег: [code=ruby]код[/code]. Когда в будущем подсветка синтаксиса для Ruby будет реализована, весь исходных код преобразится.
  • Используйтe чекбокс "Транслит" (возле кнопок кодов), если у Вас нет русских шрифтов.
  • Помните, для каждого вопроса должна быть своя тема.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, source777.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Ruby On Rails | Следующая тема »


 




[ Время генерации скрипта: 0.0517 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.