Dziekuje Panowie za szybki odzew. Teraz mam kolejny problem, ćwiczę sobie różnego rodzaju relacje i od wczoraj rana męczę się z relacją wiele do wielu. Poznałem już te dwa sposoby (3 modele + has_many,belongs_to oraz 2 modele + has_and_belongs_to_many), postanowiłem zrobić to drugim bo w tabeli ?krzyżowej? nie będę przechowywać żadnych danych oprócz kluczy obcych.
Wymyśliłem sobie bazę przechowującą produkty i kategorie, oczywiście każdy produkt może mieć wiele kategorii a kategoria należeć do wielu produktów. Fajnie by było aby przy dodawaniu nowego produktu mieć listę check box’ów wszystkich dostępnych kategorii i tam sobie wyklikać te do których zalicza sie nasz produkt. A więc tak stworzyłem migracje i modele, z poziomu konsoli rails’ow wszystko ładnie się zapisuję wiec tu raczej jest ok
to moje modele
[code]class Category < ActiveRecord::Base
has_and_belongs_to_many :products
#has_many :categories_products
#has_many :products, :through => :categories_products
attr_accessible :name, :rate
attr_accessor :check_box
attr_accessible :check_box # wirtualny atrybut
end
class Product < ActiveRecord::Base
has_and_belongs_to_many :categories
#has_many :categories_products
#has_many :categories, :through => :categories_products
attr_accessible :name, :categories
accepts_nested_attributes_for :categories
end
class CategoriesProduct < ActiveRecord::Base
belongs_to :product
belongs_to :category
end[/code]
są tam cześci zakomentowane ale jak już pisałem próbowalem dwiema metodami to zrobić
teraz jedyna ważna część kontrolera products_controller
[code] # GET /products/new
GET /products/new.json
def new
@product = Product.new
@categories2 = Category.all
categories = @product.categories.build()
respond_to do |format|
format.html # new.html.erb
format.json { render json: @product }
end
end
GET /products/1/edit
def edit
@product = Product.find(params[:id])
@categories2 = @product.categories
end[/code]
oraz istotna część widoku produktu _form
[code]<%= form_for(@product) do |f| %>
<%= f.label :name %>
<%= f.text_field :name %>
Dostepne kategorie:
<% @categories.each do |c|%>
<%= f.fields_for @categories do |builder| %>
<%= builder.check_box :check_box %>
<%= builder.label :name %>
<%= c.name %>
<% end %>
<% end %>
<%= f.submit %>
<% end %>[/code]
niestety wyświetla się w miejsce label Name. Subimt takiego forma powoduje że dostaje później obiekt Product składający się z jego pól plus tablicy tych atrybutów, z tymże każdy atrybut posiada tylko ten check_box, nei zawiera pól kategorii.
Oglądałem już kilka screencastów między innymi
[url=http://railscasts.com/episodes/196-nested-model-form-part-1?view=asciicast]#196 Nested model form part[/url]
[url=http://railscasts.com/episodes/185-formtastic-part-2?view=asciicast]#185 formtastic-part2[/url] -ten doskonale opisuje mój kłopot ale jeszcze nie chce używać formastic ani simple_form
[url=http://iqbalfarabi.net/2011/01/20/rails-nested-form-with-has-many-through-association/]Rails Nested Form with Has Many Through Association[/url]
Już mam tak łeb zlasowany tym problem, a nie potrafię odpuścić i zająć się jakąś inną rzeczą. Z góry dziękuje za podpowiedź i pomoc