Associazione molti a molti - salvataggio tabella intermedia

Ciao a tutti,
sto realizzando il mio primo progetto con Rails e sto gestendo una
relazione molti a molti tra la tabella ‘disciplines’ e la tabella
‘teachers’ (una materia e’ insegnata da molti professori e un professore
puo’ insegnare più materie) con la tabella ‘discteaches’, sto usando
l’associazione has_many-through perche’
has_and_belongs_to many mi dava ancora più problemi.
Sto gestendo l’INSERIMENTO DI UN NUOVO INSEGNANTE (nella vista scelgo la
materia con un menu a discesa), non so bene come salvare nella tabella
intermedia ‘discteaches’ l’id dell’insegnante e quello della disciplina
… quando voglio salvare Rails mi da’ “undefined variable or method
teacher…”
e non salva niente.

Qualcuno ha la pazienza di darci un’occhiata? :wink:

MODEL

in teacher.rb ho scritto:
has_many :disciplines, :through => :discteaches
in discipline.rb ho scritto:
has_many :teachers, :through => :discteaches
in discteach.rb ho scritto:
belongs_to teacher
belongs_to discipline

CONTROLLER (teachers_controller)

def create
@teacher = Teacher.new(params[:teacher])
@discteach = Discteach.new
@discteach.discipline_id = params[:discipline.id]
@discteach.teacher_id = @teacher.id
@teacher.save
@discteach.save
if @teacher.save && @discteach.save
flash[:notice] = ‘Form memorizzato!’
redirect_to teachers_path
else
render :action => ‘new’
end
end
def new
if session[:user_id]
@current_user = User.find_by_id(session[:user_id])
end
@discipline = Discipline.find(:all)
@teacher = Teacher.new
end

VISTA (teachers\new.html.erb)

<%= error_messages_for ‘teacher’ %>

Inserimento nuovi insegnanti:

<% form_for @teacher do |f| %>

cognome: <%= f.text_field :cognome %>

nome: <%= f.text_field :nome %>

materia: <% for discipline in @discipline %> " <%= discipline.descrizione %> <% end %>

<%= submit_tag "Salva insegnante" %>

<% end %>

Marco M. wrote:

in teacher.rb ho scritto:
has_many :disciplines, :through => :discteaches
in discipline.rb ho scritto:
has_many :teachers, :through => :discteaches

Allora, in entrambi manca
has_many :discteaches

def create
@teacher = Teacher.new(params[:teacher])
@discteach = Discteach.new
@discteach.discipline_id = params[:discipline.id]
^^^^^^^^^^^^^^^^
params[:discipline.id] è nil, se nella vista usi
qui dovrai usare params[:materia]

@discteach.teacher_id = @teacher.id

qui @teacher.id è nil, essendo @teacher un nuovo record non ancora
salvato id è nil. Prima devi salvare @teacher, poi assegnare
@discteach.teacher_id

Un appunto stilistico: secondo me è orribile mischiare italiano e
inglese nel codice: leggere robe tipo teacher.cognome o
discipline.descrizione fa venire l’orticaria e manca di consistenza, se
il tuo problema è avere i nomi dei campi in italiano nelle viste ti
consiglio di usare la localizzazione di rails che funziona benissimo
anche per queste cose.

Ultima nota: ci sono un paio di screencast sulle relazioni has_many e
has_many through su railscasts.com, ti consiglio di guardarli per vedere
come migliorare il codice del controller e delle viste.

Msan M. wrote:

Ti riferisci a gettext per la localizzazione?

No, alla internazionalizzazione di rails con i file .YML in
config/locales e il metodo I18n.translate… qui trovi un esempio per la
parte relativa ad activerecord:
http://iain.nl/2008/09/translating-activerecord

2009/6/6 Andrea L. [email protected]:

Un appunto stilistico: secondo me è orribile mischiare italiano e
inglese nel codice: leggere robe tipo teacher.cognome o
discipline.descrizione fa venire l’orticaria e manca di consistenza, se
il tuo problema è avere i nomi dei campi in italiano nelle viste ti
consiglio di usare la localizzazione di rails che funziona benissimo
anche per queste cose.

Ti riferisci a gettext per la localizzazione?

2009/6/6 Andrea L. [email protected]:

Msan M. wrote:

Ti riferisci a gettext per la localizzazione?

No, alla internazionalizzazione di rails con i file .YML in
config/locales e il metodo I18n.translate… qui trovi un esempio per la
parte relativa ad activerecord:
http://iain.nl/2008/09/translating-activerecord

Avevo sottovalutato la localizzazione e l’internazionalizzazione nelle
mie apps.
Ho visto che esiste un plugin, globalize,
GitHub - joshmh/globalize2: The second incarnation of Globalize for Rails.

Andrea L. wrote:

Marco M. wrote:

Grazie mille Andrea!!!
sto imparando molto in qs giorni… e l’applicativo comincia
a prendere forma!
Marco