2016-07-13 7 views
0

Mein Projekt hat drei Hauptteile dazu:Wie mache ich meine Objekte weniger unordentlich?

  • Seiten (ähnlich Artikel)
  • Kategorien (die Seiten haben eine Kategorie mit ihnen verbunden sind)
  • Schlagworte (jede Seite kann mehrere verschiedene Tags haben)

ich habe eine Sidebar, die @categories zu ziehen durch eine Liste aller aktuellen Kategorien in meinem Projekt verwendet:

<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> 

Aber momentan muss ich

@categories = Category.all 

In meinem Index aufnehmen und zeigen Aktionen in meinem Controller für beide Seiten und Kategorien, so dass die Seitenleiste Lasten (ich nur die Seitenleiste in diesen beiden Teilen des Projekts verwendet werden).

Gibt es einen einfacheren Weg dies zu tun, als den obigen Code in jede Aktion in der Steuerung einzubeziehen?

Auch mit dem Tags-Controller nach dem Erstellen einer Seite und gehen Sie auf die Show-Seite des Tags, um alle mit diesen Tags verbundenen Seiten anzuzeigen, bekomme ich eine Fehlermeldung mit der ID '= 2 konnte nicht gefunden werden.

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 %> 

bekam Wer irgendwelche Ideen? Jede Hilfe würde sehr geschätzt werden :)

Vielen Dank!

Update:

Routen-Datei:

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

Modelle:
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

Ist es ein Tippfehler oder haben Tag und Page wirklich die gleiche ID aus der Anfrage? – unused

+0

Wohin suchen Sie? Es starrt mich wahrscheinlich direkt in die Augen, aber ich kann nicht sehen, wo ich falsch gelaufen bin: p – Rixcy

+0

In den Tags # index verwenden Sie '@tag = Tag.find (params [: id])' und '@page = Page.find (params [: id]) ', also Seite und Tag mit denselben Bezeichnern? – unused

Antwort

0

Sie könnten einen before_action für die nur Index und zeigen Aktionen beschränkt Controller hinzufügen, wie unten:

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

    # Your code 

    private 

    def load_categories 
    @categories = Category.all 
    end 
end  

, dass der Wille laden Kategorien in die Instanzvariable sowohl für die Index- als auch für die Show-Aktionen.

Für den Fehler, den Sie bekommen, wenn ich es richtig gelesen habe, haben Sie verschachtelte Routen?Sie müssen die richtige ID für das Tag erhalten, nämlich: tag_id:

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

Sie erhielten: ID für beide. Wenn das nicht funktioniert, sind Ihre Routen verschachtelt? Wenn nicht, posten Sie Ihre Routen und ich werde die Antwort aktualisieren.

+0

Sind Sie über meine routes.rb-Datei informiert? Ich habe meine Frage mit den aktuellen Routen aktualisiert, ich habe noch keine Verschachtelung dort eingerichtet, ich habe die Parameter geändert in: tag_id, aber es scheint nicht geändert zu haben. Prost – Rixcy

+0

OK, also sind sie nicht verschachtelt. Die show-Aktion für eine Standardressource, die nicht verschachtelt ist, hat eine ID in den Parametern. Wenn Sie also/tag/2 verwenden, sollte die 2 die Tag-ID sein. Woher soll die Post-ID kommen? Ich bin unklar, wie Sie versuchen, dieses bestimmte Seitenobjekt aus den Params – RichardAE

+0

zu finden Ich habe meinen ursprünglichen Beitrag mit den Modellen meines Projekts aktualisiert (Entschuldigung, wenn das ein bisschen lang oder verwirrend ist), jede Seite kann viele Tags haben, und Ich möchte in der Lage sein, alle mit jedem Tag verbundenen Seiten zu sehen, indem ich auf das Tag in den Seitenindex-/show-Seiten klicke und die Kategorie zeige Seite – Rixcy

0

Sie können DRY Ihren Controller aus, um Seite und Kategorien in einem Rückruf festzulegen. Aber Vorsicht: Sie können die Kategorieabfrage in den Kategorien # index action auslassen, aber Ihre Seite # ... Aktionen können den Rückruf überhaupt überspringen skip_before_action set_page oder besser überschreiben Sie die Methode und verwenden Sie eine korrekte Handhabung.

Verwandte Themen