Habtm dodanie wpisu do bazy danych

Chce dodac do formularza tworzacego nowego klienta mozliwosc wybrania konkretnego zamowienia poprzez checkbox. Co powinienem dodac do metody create zeby rails zapisywaly relacje w tabeli customers_orders

Modele:

class Order < ActiveRecord::Base has_and_belongs_to_many :customers end

class Customer < ActiveRecord::Base has_and_belongs_to_many :orders end
Kontroler

[code=ruby] def new
@customer = Customer.new
@orders = Order.find(:all)
end

def create
@customer = Customer.new(params[:customer])

if @customer.save
  flash[:notice] = "Klient został dodany"
else
  flash[:notice] = "Nie udało sie dodac klienta"
end

end[/code]

<% form_for @customer do |f| %> <%= f.label :name %><br/> <%= f.text_field :name %> <p> <%= f.label :Wiek %> <br/> <%= f.text_field :age %> </p> <p> <% for order in @orders %> <div> <%= check_box_tag '@customer[order_ids][]', order.id, @customer.orders.include?(order) %> <%=h order.title %> </div> <% end %> </p> <%= f.submit "Dodaj" %> <% end %>

Miałem podobny problem, proszę rzuć okiem na railscasta, mi pomógł.

Tworzac to korzystalem z railcast habtm checkbox. W zasadzie wszystko dziala poniewaz dodalem kilka wpisow przez konsole ale nie wiem jak to przeniesc do kontrolera. No i to zwykly prosty zapis z uzyciem habtm wiec musi byc na to jakis prosty sposob

Zamień

<%= check_box_tag '@customer[order_ids][]', order.id, @customer.orders.include?(order) %>

na

<%= check_box_tag 'customer[order_ids][]', order.id, @customer.orders.include?(order) %>

Powinno pomóc.

Pamiętaj jeszcze o tym, że jeśli odznaczysz wszystkie check boxy, to kontroler oleje wartość customer[order_ids], bo będzie w niej nil, a nie pusta tablica. Możesz to obejść czymś takim w kontrolerze:

params[:customer][:order_ids] ||= []

[quote=GhandaL]Zamień

<%= check_box_tag '@customer[order_ids][]', order.id, @customer.orders.include?(order) %>

na

<%= check_box_tag 'customer[order_ids][]', order.id, @customer.orders.include?(order) %>

Powinno pomóc.

Pamiętaj jeszcze o tym, że jeśli odznaczysz wszystkie check boxy, to kontroler oleje wartość customer[order_ids], bo będzie w niej nil, a nie pusta tablica. Możesz to obejść czymś takim w kontrolerze:

params[:customer][:order_ids] ||= []

[/quote]
Niestety nie pomoglo.

przy uzyciu konsoli dodalem tak jeden rekord

@s = customer.new
#ustawienie wartosci w tym miejscu
@s.order_ids = [5,6]
@s.save

W tabeli laczacej customers_orders pojawily sie dwa nowe rekordy. Podejrzewam ze musze w kontrolerze dodac linijke typu:

@customer.order_ids = tablica przeslana z formularza

  Parameters: {"@customer"=>{"order_ids"=>["5", "6"]}, "commit"=>"Dodaj", "authenticity_token"=>"RAwhvc73FbPTmDJInjNqsQXDuQpagPREyU6GdLF8Ypc=", "customer"=>{"name"=>"trzy", "age"=>"34"}}

Jak widac formularz przesyla potrzebne dane ale jak sie do nich dobrac ?

Chodziło mi o to, że musisz usunąć znak ‘@’ i ustalić nazwę pola nie na @customer[order_ids], a customer[order_ids] - zauważ, że w parametrach masz już hash: {"customer"=>{"name"=>"trzy", ...}}
i dodatkowo masz hash {"@customer" => {"order_ids" => ["5","6"]}}
, a powinieneś mieć wszystkie dane pod jednym kluczem - “customer”:

{"customer"=>{"name"=>"trzy", "order_ids" => ["5","6"]}}

Zrestartowalem serwer i wszystko zadzialalo tak jak powiedziales ;). Dziekuje bardzo za pomoc

Edit:

<% for customer in @customer %> <%=h customer.name%><br/> <%=h customer.age%><br/> <% for order in customer.orders %> <li><%= order.title%></li> <% end %> <% end %>
Tak wyglada moj index.rhtml. Metoda prob i bledow udalo mi sie dojsc do tego. Zastanawiam sie jednak jak inaczej moglbym sie dobrac do order.title dla konkretnego customer. customer.orders.title ?

np:

@test = Customer.find(1)
@test.orders zwraca #Order:0x7d22828#Order:0x7d223a8 ten klient posiada dwa zamowienia. Czy jest jakas mozliwosc zebym bez uzywania petli wyciagnal nazwe tylko jednej kategori ?
@test.orders[1]