Рельсы нуждаются в советах по практике контроллера

62
6

Я пытаюсь использовать RESTfull подход в контроллерах, но иногда мне нужно действие, которое не будет соответствовать стандартным. Например, у меня есть действие индекса, показывающее все статьи, которые

def index
@articles = Article.all
end

но что, если я тоже хочу найти их? должен ли я создавать для него отдельные действия или я должен раздувать существующий контроллер, например:

def index
if params[:search]
@articles = Article.where(id: params[:search_id])
else
@articles = Article.all
end
end

Каков правильный путь?

спросил(а) 2021-01-19T22:24:46+03:00 3 месяца, 2 недели назад
1
Решение
63

Вы должны использовать одно действие и создать только действие индекса. И логика поиска относится к модели статьи.

Вы должны следовать этому

ответил(а) 2021-01-19T22:24:46+03:00 3 месяца, 2 недели назад
45

Я бы сохранил его в индексе. Если вы хотите сохранить его в чистоте и стандартизировать, вы можете изменить код контроллера таким образом:

def index
@articles = Article.search(params[:search])
end

а затем добавьте метод класса в статью

class << self
def search(options={})
if options.blank?
return self.all
else
..other search logic
end
end
end

Обратите внимание, что пример, который вы дали для поиска, на самом деле не имеет смысла, поскольку он указывает идентификатор статьи. Если вы уже знаете идентификатор, то это не действительно поиск: вы можете просто перейти на страницу показа этой статьи.

ответил(а) 2021-01-19T22:24:46+03:00 3 месяца, 2 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема