2016-07-13 3 views
0

Мой проект состоит из трех основных частей к нему:Как сделать объекты менее грязными?

  • Страницы (аналогичные изделия)
  • Разделы (страницы имеют категорию, связанную с ними)
  • Теги (каждая страница может иметь несколько различных меток)

у меня есть боковая панель, которая использует @categories протащить список всех текущих категорий в моем проекте:

<div class="col-md-3"> 
    <p class="lead">Categories</p> 
    <div class="list-group"> 
    <%= link_to 'All articles', pages_path(@page), :class => 'list-group-item' %> 
    <% @categories.each do |category| %> 
     <%= link_to category.name, category_path(category), :class => 'list-group-item' %> 
    <% end %> 
    </div> 
</div> 

Но в настоящее время мне нужно включить

@categories = Category.all 

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

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

Также с контроллером тегов после создания страницы и перехода на страницу показа тегов для просмотра любых страниц, связанных с этими тегами, появляется сообщение об ошибке «Не удалось найти страницу с« id »= 2.

class TagsController < ApplicationController 

def index 
    @tags = Tag.all 
end 

def show 
    @tag = Tag.find(params[:id]) 
    @page = Page.find(params[:id]) 
    @categories = Category.all 
end 

-

<% @tag.pages.each do |page| %> 
    <div class="thumbnail"> 
    <div class="text"> 
     <article class="clearfix"> 
     <%= link_to page.title, url_for_page(page), class: "h1" %> 
     <p class="pull-right"><span class="glyphicon glyphicon-time"></span> Posted on <%= page.created_at.to_formatted_s :long %></p> 
     <hr /> 
     <%= page.body.html_safe %> 
     <hr /> 
     <div class="btn-group btn-group-xs" role="group" aria-label="..."> 
      <% page.tags.each do |tag| %> 
      <%= link_to tag.name, tag_path(tag), class: "btn btn-info" %> 
      <% end %> 
     </div> 
     </article> 
    </div> 
    </div> 
<% end %> 

Кто есть какие-нибудь идеи? Любая помощь будет принята с благодарностью :)

Спасибо!

Обновление:

Маршруты файл:

Rails.application.routes.draw do 
    resources :categories 
    resources :pages 
    resources :tags 

Модели:
Category.rb

class Category < ActiveRecord::Base 
    has_many :pages 

Page.rb

class Page < ActiveRecord::Base 
    include Bootsy::Container 
    belongs_to :category 
    has_many :taggings 
    has_many :tags, through: :taggings 

    def tag_list 
     self.tags.collect do |tag| 
      tag.name 
     end.join(", ") 
    end 

    def tag_list=(tags_string) 
     tag_names = tags_string.split(", ").collect{ |s| s.strip.downcase }.uniq 
     new_or_found_tags = tag_names.collect { |name|   Tag.find_or_create_by(name: name) } 
     self.tags = new_or_found_tags 
    end 
end 

Tag.rb

class Tag < ActiveRecord::Base 
    include Bootsy::Container 
    has_many :taggings 
    has_many :pages, through: :taggings 

    def to_s 
     name 
    end 
end 

Tagging.rb

class Tagging < ActiveRecord::Base 
    include Bootsy::Container 
    belongs_to :tag 
    belongs_to :page 
end 
+0

Это опечатка или тэг и страница действительно имеют один и тот же идентификатор от запроса? – unused

+0

Где вы ищете? Вероятно, я смотрю прямо в глаза, но я не вижу, где я ошибся: p – Rixcy

+0

В индексе # index вы используете '@tag = Tag.find (params [: id])' и '@page = Page.find (params [: id]) ', поэтому страница и тег совпадают с одинаковыми идентификаторами? – unused

ответ

0

Вы можете добавить before_action для контроллера ограничивается только индексировать и показать действия, как показано ниже:

class TagsController < ApplicationController 
    before_action :load_categories, only: [:index, :show] 

    # Your code 

    private 

    def load_categories 
    @categories = Category.all 
    end 
end  

Это загрузит категорий в переменную экземпляра для действий индекса и show.

За ошибку, которую вы получаете, если я правильно ее читаю, у вас есть вложенные маршруты?Вы должны получать правильный идентификатор для тега, который: tag_id:

def show 
    @tag = Tag.find(params[:tag_id]) 
    @page = Page.find(params[:id]) 
    @categories = Category.all 
end 

Вы получали: идентификатор для обоих. Если это не работает, ваши маршруты вложены? Если вы не разместите свои маршруты, я обновлю ответ.

+0

Вы о моем файле routes.rb? Я обновил свой вопрос с помощью текущих маршрутов, я еще не установил там какую-либо вложенность, я изменил параметры на: tag_id, но он, похоже, не изменил его. Cheers – Rixcy

+0

ОК, поэтому они не вложены. Действие show для стандартного ресурса, который не вложен, имеет один: id в параметрах, поэтому, когда вы идете/теги/2, то 2 должен быть идентификатором тега. Откуда должен быть почтовый идентификатор? Я не понимаю, как вы пытаетесь найти этот объект для страницы из params. – RichardAE

+0

Я обновил свое оригинальное сообщение с моделями моего проекта (извините, если это довольно длинный или запутанный), каждая страница может иметь много тегов и Я хочу видеть все страницы, связанные с каждым тегом, нажав на тег на странице индексирования/показа страницы, а также на странице категории show – Rixcy

0

Вы можете указать DRY своего контроллера, чтобы установить страницу и категории в обратном вызове. Но будьте осторожны: вы можете опустить запрос категорий в действии index # категорий, но ваши действия на странице # ... могут пропустить обратный вызов вообще skip_before_action set_page или лучше перезаписать метод и использовать правильную обработку.

class ApplicationController 
    before_action set_page, only: [:index, :show] 
    before_action set_categories, only: [:index, :show] 

    private 
    def set_page 
    @page = Page.find params[:page_id] 
    end 

    def set_categories 
    @categories = Category.all 
    end 
end 
Смежные вопросы