如何解决rails中未初始化的常量错误

时间:2015-09-29 07:51:37

标签: ruby-on-rails

我有3个表categories,其中包含字段ID,name,parent_id,coaches,其中包含id,name和连接表categories_coaches以及category_id和coach_id。我想加入两个table(categories_coaches和类别)与category_id并获取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

当我尝试这个我得到这个错误

enter image description here

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

您的关联名称错误:

class Category < ActiveRecord::Base
  has_many :category_coaches
end