Forum: Rails-ES ¿Cómo hacer correctamente esto?

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
Carlos B. (Guest)
on 2009-05-21 20:11
Veréis, cada vez que un usuario se registra en mi aplicación deseo crear
(de forma aleatoria) un club y múltiples jugadores para dicho club),
tenía pensado hacer esto:

(En mi controlador Users)

def create
    @user = User.new(params[:user])

    respond_to do |format|
      if @user.save
        Club.create_club(user) #aquí está mi duda
        flash[:notice] = "Account #{@user.login} registered!"
        format.html { redirect_back_or_default home_path}
        format.xml  { render :xml => @user, :status => :created,
:location => @user }
      else
        format.html { render :action => "new" }
        format.xml  { render :xml => @user.errors, :status =>
:unprocessable_entity }
      end
    end
end

¿Es correcto crear el equipo para ese usuario de esa forma?
Carlos B. (Guest)
on 2009-05-21 20:26
Carlos Belizón wrote:
> ¿Es correcto crear el equipo para ese usuario de esa forma?

Corrijo mi idea:

def create
    @user = User.new(params[:user])
    @user.club = Club.create_random #duda

    respond_to do |format|
      if @user.save
        flash[:notice] = "Account #{@user.login} registered!,
                          Club: #{@user.club.name}"
        format.html { redirect_back_or_default home_path}
        format.xml  { render :xml => @user, :status => :created,
:location => @user }
      else
        format.html { render :action => "new" }
        format.xml  { render :xml => @user.errors, :status =>
:unprocessable_entity }
      end
    end
end

Mi duda surge debido a que no sé si es correcto crear un modelo distinto
dentro de la acción del controlador de otro recurso.
cartuchoGL (Guest)
on 2009-05-21 21:03
(Received via mailing list)
Hola a todos,

Prodias hacerlo con un after_create en User

Carlos Belizón escribió:
>
> :unprocessable_entity }
>       end
>     end
> end
>
> Mi duda surge debido a que no sé si es correcto crear un modelo distinto
> dentro de la acción del controlador de otro recurso.
>

Si es la logica de la aplicacion por que no?

Un saludo.
Carlos B. (Guest)
on 2009-05-21 21:36
cartuchoGL wrote:
> Hola a todos,
>
> Prodias hacerlo con un after_create en User
>
> Carlos Belizón escribió:
>>
>> :unprocessable_entity }
>>       end
>>     end
>> end
>>
>> Mi duda surge debido a que no sé si es correcto crear un modelo distinto
>> dentro de la acción del controlador de otro recurso.
>>
>
> Si es la logica de la aplicacion por que no?
>
> Un saludo.

Vale, es que no sabía si era más correcto usar un observer, de ahí mi
pregunta :). Aunque bueno, he hecho un cambio de diseño sobre la marcha
y me he dado cuenta que es mejor asignar un club al usuario cuando
acaben todas mis ligas y se hayan hecho las promociones de ascenso y
descenso, por lo que, teniendo en cuenta que la última acción antes de
crear temporadas nuevas es esta:

def promotion
    seasons = Season.current_seasons
    if Season.finished?(seasons)
      begin
        seasons = Season.promotion_and_relegate(League.current_seasons,
        Season::NUM_PROMOTIONS)
        seasons.each {|x| x.save!}
        respond_to do |format|
          flash[:notice] = "New seasons created"
          format.html {redirect_to '/admin/leagues'}
          format.xml {head :ok}
        end
      rescue
        respond_to do |format|
          flash[:error] = "Problems createing the new leagues with
promotions"
          format.html {redirect_to '/admin/leagues'}
          format.xml {head :error}
        end
      end
    else
      respond_to do |format|
        flash[:error] = 'You can\'t promotion the leagues'
        format.html {redirect_to 'admin/leagues'}
        format.xml {head :error}
      end
    end
end

Cómo puedo hacer que cada vez que se ejecute esa acción se ejecute lo
siguiente:

class League < ActiveRecord::Base
  self.create_new_leagues_with_users_without_club
     ## Código
  end
end
Guillermo (Guest)
on 2009-05-22 00:36
(Received via mailing list)
2009/5/21 Carlos Belizón <removed_email_address@domain.invalid>

> Carlos Belizón wrote:
> > ¿Es correcto crear el equipo para ese usuario de esa forma?
> def create
>    @user = User.new(params[:user])
>     @user.club = Club.create_random #duda


Yo hubiese tirado por un observer.
Todo lo que tenga que ver con relacionar modelos en la creación de una
instancia me gusta más hacerlo así. Y te explico el porqué.

Si algún día, en alguna tarea rake, o en algún entorno raro, no quiero
hacerlo, y quiero crear uno, podría desactivar los observers y no me
volvería loco.

Por ejemplo:

User.delete_observers
User.create(:name => 'pepe', :club => Club.first)

Suponiendo que para que un usuario sea correcto, debe de pertenecer a
algún
club, añadiría la validadción correspondiente.

class User < AR::Base
  belongs_to :club
   validates_associated :club
   validates_presence_of :club
end

class UserObserver < AR::Base
  def before_validate(user)
     user.club = Club.create_random if user.club.nil?
  end
end

Lo de usar un observer en este caso, no tengo claro si sería matar
moscas a
cañonazos, así que tampoco te se decir bien si usar un observer o el
before_validate del propio modelo.

Un Saludo.


--
Guillermo Álvarez

Sent from Madrid, Comunidad de Madrid
This topic is locked and can not be replied to.