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