Rails маршрутизация / контроллеры - список подмножеств коллекций - PullRequest
0 голосов
/ 10 ноября 2011

У меня есть блог с сообщениями в нескольких категориях. Я хотел бы дать каждой категории отдельную целевую страницу со списком всех болотных постов в этой категории.

Как правильно сгенерировать маршруты и действия контроллера для каждой из этих целевых страниц? Будет ли нарушать дух REST для создания нескольких действий индекса (по одному действию на категорию) в моем контроллере сообщений? Если да, то как еще мне это сделать?

Например, мой блог может иметь две категории: «Музыка» и «Фильмы».

GET /posts/ # would list all posts.

GET /music/ # would list all posts in the "Music" category.

GET /movies/ # would list all posts in the "Movies" category.

Извиняюсь, если на этот вопрос есть очевидный ответ, или если я задаю неправильный вопрос полностью. Я новичок в Rails и REST и пытаюсь понять, как лучше структурировать приложения.

1 Ответ

0 голосов
/ 10 ноября 2011

Я не уверен, что это полностью в духе REST (я еще не до конца понимаю), поэтому я оставлю эту часть вопроса кому-то еще. Поскольку существует collection метод для расширения маршрутов RESTful , я предполагаю, что он разрешен, если вы не злоупотребляете им. Однако я не думаю, что наличие маршрутов без префикса "/ posts /" - это хорошо, потому что, к примеру, путь "/ music /" относится к совершенно другому ресурсу.

Вы можете сделать что-то вроде этого:

(в rout.rb)

resources :posts do
   collection do
     get 'music'
     get 'movies'
   end
end

... и затем добавьте индексные действия в свой контроллер, например ::

def music
  @posts = Post.where( category: 'music')
  render :index
end

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

class Post < ActiveRecord::Base
  CATEGORIES = [:music,:movies,:art,:jokes,:friends,:whatever].freeze
end

class PostsController < ApplicationController
  Post::CATEGORIES.each do |category|
    eval <<-INDEX_LIKE_ACTIONS
      def #{category}
        @posts = Post.where( category: '#{category}' )
        render :index
      end
    INDEX_LIKE_ACTIONS
  end
end

resources :posts do
   collection do
     Post::CATEGORIES.each {|category| get category.to_s}
   end
end
...