У вас есть учебник N + 1 вопрос , плюс, что article.category
необязательно, так что вы звоните Category.find(nil).name
.
При условии, что вы установили связь 1-ко-многим между статьей и категорией
class Category
has_many :articles
end
class Article
belongs_to :category
end
Прежде всего, убедитесь, что вы загружаете категорию вместе со статьями:
class ArticlesController < ApplicationController
def index
@articles = Article.includes(:category).order(created_at: :desc)
end
end
Тогда, когда вы перебираете представление, просто используйте article.category
.
<% if article.category %>
<%= link_to article.category.name, article.category %>
<% end %>
Вам не нужно явно передавать category_path(article.category_id)
. Просто передайте запись, и Rails достаточно умен, чтобы понять это самостоятельно.
Я бы также настроил отдельный контроллер для обработки статей, вложенных в категорию:
# config/routes.rb
resources :categories do
resources :articles, only: [:index], module: :categories
end
# app/controllers/categories/articles_controller.rb
module Categories
class ArticlesController
before_action :set_category
# GET /categories/:category_id/articles
def index
@articles = @category.articles.order(created_at: :desc)
end
def set_category
@category = Category.includes(:articles).find(params[:category_id])
end
end
end
Имеет меньшую циклическую сложность и соответствует SRP . Тот факт, что контроллеры отображают другое представление, также является плюсом, поскольку позволяет настраивать представление для различных контекстов. При необходимости используйте партиалы для обмена кодом.
Вы можете связать его с:
<%= link_to "Articles in #{category.name}", [category, :articles] %>