[ruby-it] Chiamare un metodo da un altro controller

Pietro Giorgianni giorgian a gmail.com
Gio 20 Ago 2009 18:32:53 CEST


Il giorno 20 agosto 2009 18.16, Nicola Nico<theonenkl a gmail.com> ha scritto:
> Il controller A è uno UsersController che gestisce gli utenti
> registrati. In particolare consente di recuperare una
> password smarrita: se uno vuole recuperarla, seguendo il link su una
> mail, vorrei che effettuasse il login in automatico (un'azione in
> UsersController) e venisse rediretto a edit di Users.
>
> Il pallino mi è venuto quando pensavo a come creare una sessione da
> UsersController, senza fare del lavoro che dovrebbe essere fatto da
> SessionsController e senza spostare il tutto nella sopraclasse per
> mantenere le cose separate.
>
> Leggendo le vostre risposte mi viene in mente di mettere un link ad
> un'azione in SessionsController nella mail, che fa un redirect ad
> un'azione di UsersController (edit). Avete altre idee?

credo di aver capito il problema. una soluzione consiste nello
spostare gran parte della logica per la creazione di una sessione da
SessionsController a un model, ad esempio Session (che sia basato su
ActiveRecord o no non ha importanza).

l'idea sarebbe:

# controllers/sessions_controller.rb
class SessionsController < ApplicationController
  ...

  def create
    ... # eventuali controlli vari
    session = Session.new params[:session]
    ... # altro
  end
  ...
end

# controllers/users_controller.rb
class UsersController < ApplicationController
   ...

  def un_action_che_vuole_creare_una_session
    ...
    session = Session.new dativari
    ...
  end
    ...
end

# models/session.rb
class Session
  def initialize datinecessari
    ... # qui avviene quello che deve avvenire
  end
end


in generale è preferibile spostare quanta più logica possibile dal
controller al (ai) model.

alcuni esempi (che per me sono stati) illuminanti:
http://railscasts.com/episodes/119-session-based-model
http://railscasts.com/episodes/121-non-active-record-model

pietro


More information about the Ml mailing list