2013-08-28 4 views
-1

Я действительно работаю над приложением, которое должно связывать упражнение со многими подкатегориями, а подкатегории - это дочерние элементы родительской категории.Rails 3.2 Категория и подкатегория

Это мой код:

Exercice.rb BELONGS_TO: подкатегория

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: Упражнения через: подкатегорий & has_many: подкатегорий

class Category < ActiveRecord::Base 
attr_accessible :name 

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

subcategory.rb BELONGS_TO: Категория & has_many: Упражнений

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

belongs_to :category 
has_many :exercices 
end 

Exercices_controller

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 

Category_controller

def new 
    @category = Category.new 
    end 

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

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

Subcategory_controller

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 Я хочу: Назначить подкатегории для осуществления

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

Подкатегория _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' 

=> exercice/новый:

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' 

Любой знает, где я не прав? Спасибо :)

+1

Возможно, стоит немного сконцентрироваться на предоставлении некоторых сведений об ошибках. Что такое стек для них, например? Также ваш код формы кажется немного смущенным, например: 'для упражнений в Subcategory.find (: all)' это упражнение или подкатегория? – Shadwell

+0

Вы правы, я редактировал сообщения об ошибках, и я также изменил содержимое check_box_tag. Я не могу понять, откуда возникают ошибки, можете ли вы помочь? –

+0

Отключить тему, но это действительно вызовет раздражение вас через год, когда вы поймете, что неправильно произносили «упражнение» - я бы поправил его сейчас. – snowangel

ответ

0

Если честно, я думаю, вам нужно вернуться и переработать много кода.

У вас есть звонок exercices.subcategories в вашей форме, которая вызывает вашу вторую ошибку, потому что Exercisebelongs_to :subcategory, поэтому у вас может быть только одна подкатегория за упражнение.

Вы перебираете все подкатегории, чтобы установить флажок для каждой формы упражнений, которая предполагает, что вы действительно хотите, чтобы упражнение имело много подкатегорий.

Вы указали свой налог на уценку checkBoxInput, а затем вы ожидаете в своем контроллере параметра subcategories[].

Вы также выводите название упражнения для каждой подкатегории.

Итак, я бы сделал несколько шагов назад и убрал много логики кода, прежде чем пытаться исправить определенные ошибки.

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 

Это верно?