2010-02-06 4 views
0

Cette certaine partie de mon application prend soin de création de modèle de boutique en ligne pour les chaînes de magasins (comme H & M) qui en a un. Si la chaîne a un site Web qui est également une boutique en ligne, elle crée un modèle de boutique en ligne.Attributs virtuels sur les nouveaux modèles dans Rails?

Si le site Web n'est pas une boutique en ligne, il est laissé à la chaîne dans le modèle Chaîne. PROBLÈME: Je le fais avec une case à cocher et des attributs virtuels. Ainsi, lors de l'envoi d'une requête au contrôleur de chaîne, une case à cocher définit la valeur 'set_webshop'.

# Chain Model 

class Chain 
has_one :webshop, :dependent => :destroy 

def set_webshop 
    self.webshop.url == self.website unless self.webshop.blank? 
end 

def set_webshop=(value) 
    if self.webshop.blank? 
    value == "1" ? self.create_webshop(:url => self.website) : nil 
    else 
    value == "1" ? nil : self.webshop.destroy 
    end 
end 
end 

# Chain Controller 

class ChainsController < ApplicationController 
    def create 
    @chain = Chain.new(params[:chain]) 

    respond_to do |format| 
     if @chain.save 
     flash[:notice] = 'Chain was successfully created.' 
     format.html { redirect_to(@chain) } 
     format.xml { render :xml => @chain, :status => :created, :location => @chain } 
     else 
     format.html { render :action => "new" } 
     format.xml { render :xml => @chain.errors, :status => :unprocessable_entity } 
     end 
    end 
    end 

    def update 
    params[:chain][:brand_ids] ||= [] 
    @chain = Chain.find(params[:id]) 

    respond_to do |format| 
     if @chain.update_attributes(params[:chain]) 
     flash[:notice] = 'Chain was successfully updated.' 
     format.html { redirect_to(@chain) } 
     format.js 
     else 
     format.html { render :action => "edit" } 
     end 
    end 
    end 
end 

Tout fonctionne parfaitement lors de la mise à jour d'un modèle de chaîne, mais lorsqu'ils ne sont pas lors de la création d'un nouveau? Je ne peux pas comprendre pourquoi?

Voici les requêtes POST et PUT.

# POST (Doesn't work - does not create a Webshop) 
Processing ChainsController#create (for 127.0.0.1 at 2010-02-06 11:01:52) [POST] 
    Parameters: {"commit"=>"Create", "chain"=>{"name"=>"H&M", "set_webshop"=>"1", "website"=>"http://www.hm.com", "desc"=>"...", "email"=>"[email protected]"}, "authenticity_token"=>"[HIDDEN]"} 


# PUT (Works - does create a Webshop) 
Processing ChainsController#update (for 127.0.0.1 at 2010-02-06 11:09:13) [PUT] 
    Parameters: { "commit"=>"Update", "chain"=> { "name" => "H&M", "set_webshop"=>"1", "website" => "http://www.hm.com", "desc" => "...", "email" => "[email protected]"}, "authenticity_token"=>"[HIDDEN]", "id"=>"444-h-m"} 

Existe-t-il un moyen spécial de gérer virtual_attributes sur les nouveaux modèles dans Rails?

Répondre

3

Il ne fonctionnera probablement pas parce que dans cette ligne

self.create_webshop(:url => self.website) 

pour créer une boutique en ligne pour la nouvelle chaîne que vous avez pas encore id de la chaîne (il n'a pas été créé à ce moment), alors il n'y a aucune possibilité de créer une association.

Définir un rappel after_save et y créer une boutique en ligne. Pour se souvenir de la valeur de la case à cocher entre-temps, vous pouvez stocker dans un attr_accessor.

+0

Merci, a travaillé comme un charme! –