-1

我实际上正在开发一个需要将练习链接到许多子类别的应用程序,并且子类别是父类别的子类别。

这是我的代码:

Exercice.rb属于_to :subcategory

class Exercice < ActiveRecord::Base
attr_accessible :title, :description, :subcategory_id

validates :title, :presence => true

has_many :programmeexercices
has_many :programmes, :through => :programmeexercices
belongs_to  :subcategory

end

category.rb has_many :通过 :subcategories & has_many :subcategories 练习

class Category < ActiveRecord::Base
attr_accessible :name

has_many :exercices, :through => :subcategories
has_many :subcategories
end

subcategory.rb属于_to :category & has_many :exercices

class Subcategory < ActiveRecord::Base
attr_accessible :name, :category_id

belongs_to :category
has_many :exercices
end

练习控制器

def new
    @exercice = Exercice.new
    @subcategories = Subcategory.all 
  end

  def edit
    @exercice = Exercice.find(params[:id])
    @subcategories = Subcategory.all
  end

  def create
    @exercice = Exercice.new(params[:exercice])
    params[:subcategories][:id].each do |subcategory|
      if !subcategory.empty?
        @exercice.subcategory.build(:subcategory_id => subcategory)
      end
  end

类别控制器

 def new
    @category = Category.new
  end

  def edit
    @category = Category.find(params[:id])
  end

 def create
    @category = Category.new(params[:category])
  end

子类别控制器

def new
    @subcategory = Subcategory.new
    @categories = Category.all
  end

def edit
    @subcategory = Subcategory.find(params[:id])
    @categories = Category.all
  end

  def create
    @subcategory = Subcategory.new(params[:subcategory])

    params[:categories][:id].each do |category|
      if !category.empty?
        @subcategory.category.build(:category_id => category)
      end
  end

Exercice _form view I want : 为练习分配子类别

      <li id="p-select">
        <% for subcategory in Subcategory.find(:all) %>
        <div class="row">
          <section class="twelve columns">
            <article class="valign row">
              <div>
                <label class="checkbox">
                   <%= check_box_tag "checkboxInput", subcategory.id, @exercice.subcategories.include?(subcategory) %>                                    
                </label> 
              </div>
               <div>
                <h3><%= exercice.title %></h3>
              </div>                       
          </article>
          <% end %>
          </section>
        </div>
      </li>
    </li>

Subcategories _form 视图我想要:为子类别分配一个类别

<li class="field">
      <%= f.label :category %><br />
      <%= f.collection_select(:category_id, @categories, :id, :name, :include_blank => "Please select") %>
  </li>

无论是哪种形式,我都会收到一条错误消息:

=> 子类别/新:

NoMethodError in Subcategories#new
undefined method `category_id' for #<Subcategory:0x4f676b8>

app/views/subcategories/_form.html.erb:16:in `block in _app_views_subcategories__form_html_erb___180268787_42055560'
app/views/subcategories/_form.html.erb:1:in `_app_views_subcategories__form_html_erb___180268787_42055560'
app/views/subcategories/new.html.erb:3:in `_app_views_subcategories_new_html_erb___1058729489_29352300'
app/controllers/subcategories_controller.rb:30:in `new'

=> 练习/新:

NoMethodError in Exercices#new
undefined method `subcategories' for #<Exercice:0x4c992c0>

  app/views/exercices/_form.html.erb:31:in `block (2 levels) in _app_views_exercices__form_html_erb__725096104_41604048'
app/views/exercices/_form.html.erb:25:in `each'
 app/views/exercices/_form.html.erb:25:in `block in _app_views_exercices__form_html_erb__725096104_41604048'
 app/views/exercices/_form.html.erb:2:in `_app_views_exercices__form_html_erb__725096104_41604048'
 app/views/exercices/new.html.erb:3:in `_app_views_exercices_new_html_erb___924742088_42063192'
 app/controllers/exercices_controller.rb:31:in `new'

任何人都知道我错在哪里?谢谢 :)

4

2 回答 2

0

好,我知道了 !

我想要的是:一个练习有多个子类别,只有一个类别。一个子类别只有一个类别。一个类别有多个子类别。

****class Exercice < ActiveRecord::Base****
  attr_accessible :title, :subcategory_id

  has_many :subcategories
  has_one :category, :through => :subcategories


****class Category < ActiveRecord::Base*****
  attr_accessible :name

  has_many :subcategories
  has_many :exercices, :through => :subcategories


***class Subcategory < ActiveRecord::Base****
  attr_accessible :name, :category_id

  belongs_to :category
  has_many :exercices

这是正确的 ?

于 2013-08-29T13:46:41.233 回答
0

老实说,我认为您需要返回并重新编写大量代码。

您的表单中有一个调用,exercices.subcategories这导致了您的第二个错误,因为Exercise belongs_to :subcategory每个练习只能有一个子类别。

您正在遍历所有子类别以在练习表单上为每个子类别提供一个复选框,这表明您实际上希望练习具有许多子类别。

您已将复选框命名为 tax checkBoxInput,然后您期望subcategories[]控制器中有一个参数。

您还将为每个子类别输出练习标题。

因此,在尝试修复特定错误之前,我会后退几步并整理大量代码逻辑。

于 2013-08-29T09:09:19.633 回答