Forum: Italian Ruby user group associazione molti a molti - salvataggio tabella intermedia

Posted by Marco Mueller (marco_m)
on 2009-06-05 17:19
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' %>
<h1>Inserimento nuovi insegnanti:</h1>
<% form_for @teacher do |f| %>
<p>
  cognome: <%= f.text_field :cognome %>
</p>
<p>
  nome:  <%= f.text_field :nome %>
</p>
<p>
  materia:
  <select name="materia">
    <% for discipline in @discipline %>
    <option value= "<%= discipline.id %>" <b><%= discipline.descrizione
%></b>
    </option>
  <% end %>
  </select>
</p>
<p>
  <%= submit_tag "Salva insegnante" %>
</p>
<% end %>
Posted by Andrea Longhi (andrea)
on 2009-06-06 11:36
Marco Mueller 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 <select name="materia"> 
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.


Posted by Msan Msan (msan)
on 2009-06-06 12:05
(Received via mailing list)
2009/6/6 Andrea Longhi <andrea74@mailshack.com>:
> 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?
Posted by Andrea Longhi (andrea)
on 2009-06-06 16:29
Msan Msan 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>
Posted by Msan Msan (msan)
on 2009-06-07 13:12
(Received via mailing list)
2009/6/6 Andrea Longhi <andrea74@mailshack.com>:
> Msan Msan 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,
http://github.com/joshmh/globalize2/tree/master.
Posted by Marco Mueller (marco_m)
on 2009-06-07 14:55
Andrea Longhi wrote:
> Marco Mueller wrote:
> 

Grazie mille Andrea!!!
sto imparando molto in qs giorni... e l'applicativo comincia
a prendere forma!
Marco
Please log in before posting. Registration is free and takes only a minute.
Existing account (Switch to SSL-encrypted connection)
NEW: Do you have a Google/GoogleMail or Yahoo account? No registration required!
Log in with Google account | Log in with Yahoo account
No account? Register here.