2015-07-27 2 views
1

Я делаю сайт в стиле онлайн-журнала, и у меня возникают трудности с синтаксисом для моей последней части проекта. Взаимоотношения работают так, как будто мне просто не удается вызвать запланированные записи.Ruby on Rails: поиск записей с использованием прошедших параметров

Каждый post принадлежит к category с category_id является внешним ключом. Когда пользователь нажимает на эту ссылку, <%= link_to 'News', categories_path(:category_id => 1) %>, я бы хотел, чтобы они были представлены на индексную страницу, отображающую только posts с category_id, соответствующие параметру в URL-адресе.

Я уже почти два часа болтаю в categories_controller.rb без везения. Кто-нибудь может так любезно бросить эту нору в кость?

ответ

2

Есть несколько компонентов, что вы пытаетесь сделать. Мы начнем с маршрутизации и перейдем к контроллеру.

Прежде всего, вам нужно сделать правильные маршруты. Поскольку почта принадлежит к категории, вам нужно будет иметь идентификатор категории, чтобы обрабатывать какие-либо операции над сообщениями. Поэтому нам нужен маршрут, например, /category/:category_id/posts/:id. К счастью, Rails имеет кое-что, чтобы справиться с этим. Если вы вложите resources в пределах resources, он будет генерировать эти маршруты. Итак, мы закончили тем, что:

resources :categories do 
    resources :posts 
end 

И это даст вам то, что вы хотите с точки зрения маршрутов. Но теперь мы должны его реализовать. Итак, нам нужно будет взглянуть на контроллеры. Если вы заметили, все эти маршруты имеют :category_id - так отрываясь категории не должно быть слишком сложным:

class PostsController < ApplicationController 
    before_action :load_category 

private 

    def load_category 
    @category = Category.find(params[:category_id]) 
    end 

end 

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

class PostsController < ApplicationController 
    before_action :load_category 

    def index 
    @posts = @category.posts 
    end 

    def show 
    @post = @category.posts.find(id: params[:id]) 
    end 

    # ... 
end 

для ссылки на пути Почтового индекса, вы должны будете использовать category_posts_path помощника.

+0

Спасибо, Джерми, ты очень добрый. – Ryan

0

Ваша проблема заключается в том, что вы пытаетесь использовать существующий маршрут для обработки некоторых новых функций (для которых он случайно не был разработан). Этот маршрут categories_path предназначен для перехода к вашему индексу категории.

Вам необходимо создать метод в вашем контроллере для выполнения функций, которые вы хотите видеть.

class PostsController < ApplicationController 
    ... 

    def posts_by_category 
    @posts_by_category = Post.where("category_id = ?", params[:category_id]) 
    end 

    ... 
end 

Тогда вы будете нуждаться представлением для отображения ваших @posts_by_category массива (я оставлю это упражнение для вас).

И теперь за ключом к вашей проблеме: вам нужен маршрут, указывающий на метод posts_by_category.

get 'posts/posts_by_category' => 'posts#posts_by_category' 

Теперь вы должны быть в состоянии создать связь с правильным маршрутом:

<%= link_to 'News', posts_by_category_path(:category_id => 1) %> 
Смежные вопросы