2015-09-29 37 views
0

我有3个表categories与字段id,名称,parent_id,coaches与id,名称和连接表categories_coaches与category_id和coach_id。我想用category_id连接两个表(categories_coaches和categories)并获取parent_id。当我运行此,请给我这个如何解决轨道未初始化的常量错误

这里的解决方案是我的代码

模式

class Category < ActiveRecord::Base 
    has_and_belongs_to_many :coaches 
end 

class Coaches < ActiveRecord::Base 
    has_and_belongs_to_many :categories 
end 

查看/ new.html.erb

<%= select_tag 'category', options_from_collection_for_select(@category.coaches, 'id', 'name')%>

控制器

class CategoriesController < ApplicationController def new end end

当我尝试这个IAM收到此错误

enter image description here

+0

的型号名称和联系是错误的,你应该看看在http:/ /guides.rubyonrails.org/association_basics.html – Pavan

+0

使用'CategoryCoaches'不是'CategoriesCoaches' –

+1

而不是使用图像善意地提及问题中的错误。它可以帮助其他有相同错误的用户找到这个问题 – Gogo

回答

1

您需要通过奇异名称格式打电话给你的模型。

您还需要确保你的协会反映无论是单数还是复数(belongs_to是单数):

class CategoryCoach < ActiveRecord::Base 
    belongs_to :category 
end 

这还要为其他协会:

#app/models/coach.rb 
class Coach < ActiveRecord::Base 
    has_many :category_coaches 
end 

ActiveRecord

您需要处理ActiveRecord关联。具体来说,您已经以特有的方式关联了您的模型。

我会使用一个has_and_belongs_to_many协会:

#app/models/coach.rb 
class Coach < ActiveRecord::Base 
    has_and_belongs_to_many :categories 
end 

#app/models/category.rb 
class Category < ActiveRecord::Base 
    has_and_belongs_to_many :coaches 
end 

你会需要用下面的连接表:

#categories_coaches 
category_id | coach_id 

这会给你打电话@category.coaches等的能力:

enter image description here


结构

我觉得有一个更深层次的结构性问题,以知足。

首先,为什么要将ProgrammesController嵌入到命名空间?命名空间与您的控制器结构无关 - 它只是提供了一种在应用程序中隔离功能的方法。

您应该构建您的应用程序是这样的:

#config/routes.rb 
resources :coaches do 
    resources :programmes #-> url.com/coaches/:coach_id/programmes/new 
end 

#app/models/coach.rb 
class Coach < ActiveRecord::Base 
    has_many :programmes 
end 

#app/models/programme.rb 
class Programme < ActiveRecord::Base 
    belongs_to :coach 
end 

#app/controllers/programmes_controller.rb 
class ProgrammesController < ApplicationController 
    def new 
     @coach = Coach.find params[:coach_id] 
     @programme = @coach.programmes.new 
    end 
    def create 
     @coach = Coach.find params[:coach_id] 
     @programme = @coach.programmes.new programme_params 
     @programme.save 
    end 

    private 

    def programme_params 
     params.require(:programme).permit(:x, :y, :z) 
    end 
end 
+0

也不是'has_many:categories_coaches'应该是'has_many:category_coaches'? – Pavan

+0

是的,我只是写了^ _ ^,感谢提示! –

+0

@RichPeck ..请参阅我的代码和问题中的更新 – SreRoR

0

你的公会是错误命名为:

class Category < ActiveRecord::Base 
    has_many :category_coaches 
end 
相关问题