Поисковое действие в модели рельсов ReSTful - PullRequest
3 голосов
/ 23 марта 2012

Итак, я довольно новичок в Rails и все еще работаю над принципами. Я полагаю, что, как и большинство людей, я начал создавать этот базовый CRUD. Хорошо. Готово.

Теперь я хочу новое действие: поиск. Как выяснилось, это не одно из 7 остальных священных (!) Действий (если оно получилось правильно). Хотя я знаю, что могу реализовывать новые пользовательские действия и создавать ресурсы и все такое, я читаю в нескольких местах, чтобы постараться как можно дольше придерживаться стандартных. Хорошо. Какой будет правильный путь?

Опять же, несколько источников, таких как этот парень , предлагают подумать о моих сценариях в терминах существительных , в случае которых, кажется, мне понадобится контроллер "поиска" ...? Это просто не убеждает меня в том, что мне придется создавать целый класс, тогда как я обычно делаю def search, чтобы сохранить его ResTful.

Что я не так понял? Какое будет общее решение здесь?

спасибо.

Ответы [ 3 ]

5 голосов
/ 23 марта 2012

ОТДЫХ - это концепция, а не религия :-). Но основными глаголами являются GET / POST / PUT / DELETE, которые отображаются на связанные с ними HTTP-глаголы. То, что в URL-адресе, как правило, отражает это, и (это больше философия Rails) следующее соглашение может сделать все намного проще. URL-адреса, которые вы получаете с общими рельсами (например, scaffold), не особенно идеальны в нескольких отношениях, но они работают, и вы можете изменить их.

Итак, да, для поиска (при условии, что он начинается просто, например, поиск записей в одной модели, скажем, Product), вы можете выполнить GET со строкой запроса, такой как

def search
  @results = Product.where("name ILIKE ?", params[:query])
  ...
end

Что приведет к URL-адресу типа /product/search?query="foo" - ничего плохого в этом нет.

4 голосов
/ 23 марта 2012

Зависит ли ваш поиск от ОДНОГО ресурса или множества ресурсов. Например, если у вас есть ProductsController и вы хотите реализовать функцию поиска только для ваших продуктов, вы можете создать действие сбора, называемое «поиск» (URL будет / products / search)

Если ваш поиск по многим ресурсам, я бы создал SearchesController с одноэлементным ресурсом: поиск в моем файле маршрутов.

Опять же, когда вы реализуете функции поиска в своем приложении, не помещайте всю логику в свой контроллер, а создавайте классы моделей для обработки вашего поиска. Вы даже можете создать абстрактный класс для сопоставления с формой поиска и, таким образом, избегать использования полей '* _tag' для создания формы поиска.

См .: https://github.com/slainer68/basic_active_model

3 голосов
/ 25 октября 2012

Если вы хотите придерживаться REST (который на самом деле является руководящим принципом, у него есть свои плюсы и минусы), то слайдшер, на который вы ссылаетесь, рекомендует правильный способ действий.у вас есть comments_controller, и вы хотите иметь возможность искать комментарии, вы можете создать comments_search_controller.Форма поиска будет по адресу comments_search_controller # new, что приведет к POST для comments_search_controller # create.

Да, вы создаете другой класс, делающий это таким образом, но это мало чем отличается от создания другого действия в comments_controller, и он поддерживает согласованность и разделение.Вам не понадобится новая модель CommentSearch или что-то еще, только тот контроллер, который запрашивает у вашей модели Comment соответствующие результаты поиска.

...