Rails 3: рельсы новичка смущают маршруты / контроллеры - PullRequest
1 голос
/ 10 октября 2011

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

Когда пользователь вошел в систему, корневой веб-адрес является его приборной панелью.

routes.rb

root :to => "pages#home"

И на страницах # home находится фид пользователя: @feed_items = current_user.feed

PagesController

def home
    @title = "Home"
    @featured_posts = Post.featured.limit(10)
    if user_signed_in?
      @user = current_user
      @post = current_user.posts.build
      @feed_items = current_user.feed.paginate(:per_page => "10", :page => params[:page])
    end
end

Теперь я понял, как разобрать фид и вытащитьподмножество фида, которое содержит только сообщения с category_id '2' (также известный как 'thriller')

 @thriller_feed_items= current_user.feed.where(:category_id => '2')

Когда зарегистрированный пользователь переходит в root_path, он видит свою панель мониторинга и весь фид.Мне бы хотелось, чтобы была ссылка «триллеры», которая изменит текущие целые @feed_items на @thriller_feed_items, но я не совсем понимаю, как будут работать маршруты и представления.Твиттер использует /! # / Упоминает в качестве адреса для подмножества фидов. Нужно ли делать то же самое?Как бы я это настроил?

РЕДАКТИРОВАТЬ: показать, как работает мой метод подачи.

Модель пользователя

  def feed
    Post.from_users_followed_by(self)
  end

Пост-модель

   def self.followed_by(user)
      followed_ids = %(SELECT followed_id FROM relationships
                       WHERE follower_id = :user_id)
      where("user_id IN (#{followed_ids}) OR user_id = :user_id", :user_id => user)
    end

Ответы [ 2 ]

2 голосов
/ 10 октября 2011

Я предполагаю, что этот контроллер не RESTful.

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

routes.rb

match "/category/:category" => "pages#home"

Страница # дом

def home
  @title = "Home"
  @featured_posts = Post.featured.limit(10)
  if user_signed_in?
    @user = current_user
    @post = current_user.posts.build
    # BEGIN NEW
    if params[:category]
      # is :category an integer id?
      if params[:category].to_i.to_s == params[:category]
        @feed_items= current_user.feed.where(:category_id => params[:category])
      else
        # assuming Category has_many :feeds
        @feed_items= current_user.feed.includes(:category).where(
          ['`categories`.name = ?', params[:category]]
        )
      end
    else
      @feed_items = current_user.feed
    end
    @feed_items = @feed_items.paginate(:per_page => "10", :page => params[:page])
    # END NEW
  end
end

Вид:

<%= link_to "Thriller Feed Items (by id)", "/category/2" %>
<%= link_to "Thriller Feed Items (by name)", "/category/Thriller" %>
1 голос
/ 10 октября 2011

так почему бы вам не использовать свой контроллер Pages для создания нового действия контроллера, называемого триллером, и нового представления, называемого pages / thriller.html.erb.

В вашем route.rb вы могли бы затем сделать что-тонапример:

get 'page/thriller'

или

match 'thriller' => 'page#thriller'

В более общем смысле вы можете создать жанровое действие и передать жанр как идентификатор.

как

match 'genre/:genre_id' => 'page#genre' (you get the parameter with params[:genre_id])

Также прочитайте руководство по маршрутизации .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...