0 votes

.la méthode de construction ne veut pas faire les deux _id's quand l'objet a deux :belongs_to... ?

J'ai un objet appelé Review qui appartient à deux objets : Utilisateurs et Fournisseurs. En d'autres termes, il y a toujours un vendeur qui écrit une critique pour un vendeur spécifique.

Lorsque je crée un examen, j'ai essayé d'utiliser la méthode .build pour ajouter la clé étrangère au moment où le nouvel enregistrement est créé pour review.vendor_id et review.user_id.

Lorsque je place dans le contrôleur de révision l'instruction de construction pour l'identifiant de l'utilisateur sans celle pour la capture de l'identifiant du fournisseur, cela fonctionne comme un charme. Lorsque j'ajoute le vendor_id, le user_id reste 'nil'.

Aide ? Reviews est une ressource imbriquée : vendeurs/3/reviews/new

Formulaires à revoir/nouveaux :

<% 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

2voto

EmFi Points 18645

C'est votre problème.

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

Vous écrasez @review avec un nouvel examen généré par @vendor.reviews.build . Au lieu de créer un nouvel examen, vous devriez simplement définir la deuxième 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 :vendor_id partie de la form_for @review . En supposant qu'un examen est une ressource imbriquée de Vendeur

Exemple :

Actions du 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 %>

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X