Trikita: Гугл атрофирует мозг. Вместо того, чтобы подумать головой, человек лезет в гугл и ищет там ответ на простейший вопрос. Да, в нем можно найти решение проблемы, но это расслабляет. Человек привыкает залезать в Гугл, SO или Тостер при любой, даже самой простейшей, проблеме.
Nikolay1488: это вам решать. Рельсы — это инструмент. Такой же, как и любой фреймворк на PHP, Python, Java, Go, JavaScript и любом другом языке. Все они решают одни и те же задачи. Выбирайте то, что вам нравится.
lavezzi1: пользователь вводит в форме id книги, отправляет запрос, контроллер получает id книги, вызывает book = GoodreadsService.new.book('id книги') потом что-то типа: Book.create(title: book[:title], author: book[:author]]) и создается книга в БД с данными из Goodreads. Но я не знаю, что возвращает метод book, это надо смотреть документацию гема.
Или можно сделать метод класса в Book:
def self.create_from_goodreads(id)
book = GoodreadsService.new.book('id книги') # ещё нужно ловить ошибку, если книга не найдена
create(title: book[:title], author: book[:author]])
end
и в контроллере просто вызывать Book.create_from_goodreads('id книги').
Второй способ предпочтительнее.
basania: Даже не знаю, но думаю, что нет. Вообще по руби и рельсам весь качественный материал только на английском языке, поэтому стоит подучить английский (теперь ведь есть очень веская причина ;)
m0dE: Вообще странная ошибка. И странно, почему он не до конца показывает трейс, не видно, где именно вызывается метод name. В коде я его тоже не нашел. Тут остается только дебажить код и смотреть вызов этой 157 строчки.
vladamir smertniy: инстансные переменные в модуле (@result, @stats_hash) совершенно не нужны. И, по идее, они тоже сохраняются между запросами. Вместо tracks.each нужно использовать tracks.map.
Я бы переделал на класс, инстанцировал бы его в before_action, передавал бы в него params, проверял бы их в initialize и сохранял в инстансные переменные. calculate_stats_model, calculate_stats_field сделал мы инстансными методами и вызывал бы их в экшенах (через объект класса Stats, созданный в before_action), передавая только нужные для этих методов параметры. get_stats_hash сделал бы приватным, так как снаружи он не вызывается. Ну, в общем, и всё.
vladamir smertniy: Общие переменные для многих методов — это обычные инстансные переменные, которые объявляются внутри методов.
Вот я накидал пару вариантов рефакторинга твоего кода: https://gist.github.com/Jeiwan/947de8cfe333759b42cc Первый вариант с модулем (в твоем случае класс вообще не нужен), второй вариант с классом (позволяет делать кеширование результата, строка 34). Переменные @model, @date_from, @date_to — инстансные переменные, которые доступны во всех инстансных методах (calculate_stats, process_tracks).
Бонус: в обоих случаях упрощается код контроллера, так как отпадает необходимость в методе set_default_params.
vladamir smertniy: "Но я же перегружаю страницу - соотвественно и приложение же перегружается?" — что за бред, кончено нет. Перезагрузи сервер — перезагрузится и класс. Или, если сервер запущен в development-окружении, можно отредактировать stats.rb и тогда рельсы сами его перегрузят, обновив переменную (теоретически).
Если серьезно, то все зависит от того, сколько сил вы готовы вкладывать. Самое простое решение: сделать для всех ресторанов теги, вроде "хочу пообедать", "пригласить девушку на свидание", "заказать еду на дом". При вводе одного из таких тегов будут показываться рестораны. Тут трудность в том, чтобы заранее составить такой список, который бы охватывал все возможные запросы пользователей.
Ещё вариант: составить списки отдельных ключевых слов (обед, ужин, свидание, девушка и т. п.), сопоставить эти списки с тем или иным результатом выдачи (ресторан, театр, спортзал), анализировать запрос пользователя и смотреть, из какого списка в его запросе слова встречаются чаще. Ну и показывать соответствующий результат.
Более сложный вариант состоит в лингвистическом анализе текстов: запрос пользователя анализируется, выделяются корни слов (или семы, или ещё что-то более лингвистически сложное), корни группируются то тематике и дальше по совокупности корней определяется результат выдачи. Но это довольно сложное решение, которое требует ещё и хорошего лингвиста под рукой.
Может быть есть какие-то готовые библиотеки, но я сомневаюсь, что они будут бесплатными и что они будут доступны для русского языка. Возможно, я тут не прав.
idevbot007: вы сказали, что будете рады любому совету :( К тому же, это вполне рабочее решение, только трудно реализуемое. Зато если реализовать, то можно поработить весь мир.