Ciao a tutti,
sono nuova al mondo rails.
Avrei bisogno di alcune delucidazioni in merito all’associazione
has_many :through!
Ammettiamo di avere:
models:
class Ship < ActiveRecord::Base
has_many :ways
has_many :sections, :through=>:ways
end
class Section < ActiveRecord::Base
has_many :ways
has_many :ships, :through=>:ways
end
class Way < ActiveRecord::Base
belongs_to :section
belongs_to :ship
end
Nella vista relativa all’inserimento di una nuova nave voglio poter
scegliere quale tratta deve fare e definire altre informazoni
aggiuntive.
ships/new.html.erb
<% form_tag :action=>“create” do %>
…
-
<% for s in @sections %>
-
<%= s.from %> - <%= s.to %>
Start date
...
<%= text_field "way" + s.id.to_s, "start_date" %>
<%end%>
A questo punto nel controller, ShipController, per permettere la
creazione della nave definisco il metodo create così:
def create
@ways = Array.new
@ship = Ship.new(params[:ship])
@sections = Section.find(:all)
@ship.gate_id = Gate.find(params[:gate_id]).id if params[:gate_id]
@ship.save
for i in 0…params[:section_ids].length-1
@section = Section.find(params[:section_ids][i])
@ways[i] = Way.new(params[“way” + @section.id.to_s])
@ways[i].section_id = @section.id
@ways[i].ship_id = @ship.id
@ways[i].save
end
@ship.sections = @ways
if @ship.save
...
else
...
end
end
L’inserimento nel DB avviene in maniera corretta.
Ora la mia richiesta è: se voglio fare delle modifiche per una ragione
X, come dovrei creare la pagina edit.html e come devo specificare il
metodo update?
Io ho iniziato con una bozza:
<% for s in @sections %>
<input type=“checkbox” name=“section_ids[]” id="<%= s.id %>"
value="<%= s.id %>" <% if @ship.sections.include? s then %>
checked=“checked”
<%end%> >
<%= s.from %> - <%= s.to %>
<% if @ship.sections.include? s then %>
<%for w in @ways %>
<% if w.ship.id == @ship.id and w.section_id == s.id then %>
<% @way = w %>
Start date
<%= text_field :way,:start_date %>
…
<%end%>
<%end%>
<%else%>
<% @way = nil %>
Start date
<%= text_field :way,:start_date %>
il metodo update sarebbe questo:
def update
@ship = Ship.find(params[:id])
@sections = Section.find(:all)
@ship.gate_id = Gate.find(params[:gate_id]).id if params[:gate_id]
@ways = Way.find(:all, :conditions=>[“ship_id=?”,params[:id]])
@ship.update_attributes(params[:ship])
#cancello i tragitti con l’id della nave specificato
for way in @ways
Way.delete_all([“ship_id=?”, @ship.id])
end
for i in 0…params[:section_ids].length-1
@section = Section.find(params[:section_ids][i])
puts params[:way]
#puts params[:way][:@section.id]
@ways[i] = Way.new(params[:way])
@ways[i].section_id = @section.id
@ways[i].ship_id = @ship.id
@ways[i].save
end
@ship.sections = @ways
if @ship.update_attributes(params[:ship])
...
else
...
end
end
Ovviamente nn funziona, ma mi rendo conto che il mio problema è legato
all’inesperienza.
Qualcuno può aiutarmi.
Grazie mille a tutti anticipatamente.