0

J'ai créé une relation polymorphe dans un livre qui analyse une application que j'écris. Mon application a les modèles imbriqués: Pièce >> Section >> Sous-section >> Subsubsection, et j'ai créé un modèle qui appartient à tous ceux-ci appelés KeyConcept, mon intention étant que chacun d'entre eux peut avoir un concept clé.LoadError dans Controller # index

Je reçois une erreur que je ne comprends pas lorsque j'essaie d'afficher l'action d'index du contrôleur keyconcepts. Je pense que cela pourrait être dû à un conflit de noms mais je n'ai pas assez d'expérience pour le comprendre.

l'erreur que je reçois ressemble à ceci:

Unable to autoload constant KeyConceptsController, expected /home/david/Documents/Learning/StuddyBuddy/app/controllers/key_concepts_controller.rb to define it 

    else 
     require_or_load(expanded, qualified_name) 
     raise LoadError, "Unable to autoload constant #{qualified_name}, expected #{file_path} to define it" unless from_mod.const_defined?(const_name, false) 
     return from_mod.const_get(const_name) 
    end 
    elsif mod = autoload_module!(from_mod, const_name, qualified_name, path_suffix) 

Mon contrôleur keyconcepts ressemble à ceci:

key_concepts_controller.rb classe Key_conceptsController < ApplicationController comprennent KeyconceptsHelper

def whereami 
    if params[:piece_id] 
     @piece = Piece.find(params[:piece_id]) 
     @keyconcept = @piece.key_concepts.find(params[:id]) 

     here = @piece 
     parameter = :piece_id 
     type = "Piece" 
    elsif params[:section_id] 
     @section = Section.find(params[:section_id]) 
     @piece = @section.piece_id 
     @keyconcept = @section.key_concepts.find(params[:id]) 

     here = @section 
     parameter = :section_id 
     type = "Section" 
    elsif params[:subsection_id] 
     @subsection = Subsection.find(params[:subsection_id]) 
     @section = @subsection.section_id 
     @piece = Section.find([email protected]).piece_id 

     here = @subsection 
     parameter = :subsection_id 
     type = "Subsection" 
    elsif params[:subsubsection_id] 
     @subsubsection = Subsubsection.find(params[:subsubsection_id]) 
     @subsection = @subsubsection.subsection_id 
     @section = Subsection.find([email protected]).section_id 
     @piece = Section.find([email protected]).piece_id 

     here = @subsubsection 
     parameter = :subsubsection_id 
     type = "Subsubsection" 
    end 
end 

def redirect 
    if type == "Piece" 
     @redirect = redirect_to piece_path(@piece) 
    elsif type == "Section" 
     @redirect = redirect_to piece_section_path(@piece, @section) 
    elsif type == "Subsection" 
     @redirect = redirect_to piece_section_subsection_path(@piece, @section, @subsection) 
    elsif type == "Subsubsection" 
     @redirect = redirect_to piece_section_subsection_subsubsection_path(@piece, @section, @subsection, @subsubsection) 
    end 
end 

def index 
    whereami.call 
    @piece = Piece.find(params[:piece_id]) 
    @keyconcept = @piece.key_concepts.find(params[:id]) 
    @redirect = redirect.call 
end 

def show 
    whereami.call 
    redirect.call 
end 

def new 
    @keyconcept = KeyConcept.new 
    @keyconcept.conceptable_id = here.id 
end 

def create 
    whereami.call 

    @keyconcept = KeyConcept.new(keyconcept_params) 

    @keyconcept.conceptable_id = params[parameter] 
    @keyconcept.conceptable_type = type 
    @keyconcept.save 

    redirect.call 
end 

def destroy 
    here.destroy 
    redirect.call 
    flash.notice = "#{type} '#{here.name}' from '#{@piece.name}' deleted!" 
end 

def edit 
    whereami.call 
end 

def update 
    whereami.call 

    here.update(keyconcept_params) 
    flash.notice = "#{type} '#{here.name}' Updated!" 
    redirect.call 
end 


end 

la lien provient de l'action de spectacle de la tarte parente modèle CE ici:

<% @piece.key_concepts.each do |concept| %> 
<li> 
    <%= link_to concept.definition, [@piece, @keyconcept] %> 
    <!-- we didn't use #piece_key_concept_path(@piece, @keyconcept), class: 'section_name' and it worked --> 
</li> 

Comment puis-je créer un lien vers le keyconcepts "show" action de la manière? Je nai pu donc je viens d'associer à l'action de l'indice:/

Ainsi, le fichier routes.rb ressemble à ceci:

resources :pieces do 
    resources :sections do 
    resources :subsections do 
     resources :subsubsections 
    end 
    end 
    resources :links 
end 

resources :pieces, :sections, :subsections, :subsubsections do 
    resources :connections, only: [:index, :new, :edit, :update, :destroy, :create] 
    resources :keyconcepts, only: [:index, :new, :edit, :update, :destroy, :create, :show] 
end 

key_concept.rb

class KeyConcept < ActiveRecord::Base 
    belongs_to :conceptable, polymorphic: true 
end 

piece.rb

class Piece < ActiveRecord::Base 
    include Connectable 
    include Conceptable 
    has_many :sections 
    has_many :subsections, through: :sections 
    has_many :links 
end 

dans les modèles/préoccupations/conceptable.rb Module Conceptable étendent ActiveSupport :: Concern

included do 
    has_many :keyconcepts, as: :conceptable 
    end 
end 
+0

Vous semble sûrement nouveau sur les rails –

Répondre

0

Eh bien, le problème est convention de nommage

Votre key_concepts_controller nom de classe doit être

KeyConceptsController < ApplicationController 

Assurez-vous également que vous suivez les conventions appropriées

Si votre modèle le nom est KeyConcept le nom de fichier doit être key_concept.rb

Nom du contrôleur doit être KeyConceptsController et le nom du fichier doit être key_concepts_controller.rb

va de même avec les routes

resources : key_concepts 

Reportez-vous this pour plus de détails