2010-01-03 5 views
0

J'ai un objet appelé Review qui: appartient à deux objets: Utilisateurs et Fournisseurs. En d'autres termes, il y a toujours un fournisseur qui écrit un avis pour un fournisseur spécifique.La méthode .build ne veut pas faire les deux _id quand l'objet en a deux: belongs_to ...?

Lorsque j'ai créé une révision, j'ai essayé d'utiliser la méthode .build pour ajouter vraisemblablement la clé foreign_key au moment où le nouvel enregistrement est créé pour review.vendor_id et review.user_id.

Lorsque je mets dans le contrôleur pour examiner l'instruction de construction pour l'ID utilisateur sans un pour capturer l'identifiant du fournisseur, cela fonctionne comme un charme. Lorsque j'ajoute le paramètre vendor_id, l'ID utilisateur reste 'nul'.

Aide? Avis est une ressource imbriquée: les vendeurs/3/commentaires/new

formulaires pour l'examen/nouvelles:

<% form_for [@vendor, @review] do |f| %> 

Dans le contrôleur de révision:

def new 
     @vendor = Vendor.find(params[:vendor_id]) 
     @review = @vendor.reviews.build 
     #@review = Review.new 
    end 



def create 
    @vendor = Vendor.find(params[:vendor_id]) 
    @review = @current_analyst.reviews.build params[:review] 

    if @review.save 
     flash[:notice] = "Successfully created review." 
     redirect_to review_path(@review) 
    else 
    render :action => 'new' 
end 

fin

Répondre

2

Ceci est votre problème.

@review = @current_analyst.reviews.build 
@vendor = Vendor.find(params[:vendor_id]) 
@review = @vendor.reviews.build params[:review] 

Vous écrasez @review un nouveau commentaire généré par @vendor.reviews.build. Au lieu de créer une nouvelle révision, vous devez simplement définir la seconde clé étrangère en utilisant les méthodes créées par l'association belongs_to. Comme ceci:

@review = @current_analyst.reviews.build params[:review] 
@review.vendor_id = params[:vendor_id] 

Pour accélérer ce processus, vous pouvez faire partie de la :vendor_idform_for @review. Si l'on suppose un examen est une ressource imbriquée du vendeur

Exemple:

Actions Contrôleur:

def new 
    @vendor = Vendor.find(params[:vendor_id]) 
    @review = @vendor.reviews.build 
end 

def create 
    @review = @current_analyst.reviews.build params[:review] 
    if @review.save 
    redirect_to @review 
    else 
    render :action => :new 
    end 
end 

forme partielle:

<% form_for @review do |f| %> 
    ... 
    Standard form information 
    ... 
    <%= f.hidden_field :vendor_id%> 
    <%= submit_tag %> 
<% end %> 
+0

Est-il possible que je ne pouvais pas utiliser le champ caché? Oui, il s'agit d'un fournisseur de ressources imbriqué/3/reviews/new .... est-il possible de faire form_for [@ vendeur, @ review] et de se débarrasser du champ caché? Ce serait parfait! – Angela

Questions connexes