1 bouton Soumettre pour 2 modèles (fields_for) dans Rails 2.3.9
-
29-09-2019 - |
Question
J'ai 2 modèles qui correspondent à 2 tables db séparés.
modèle1: les mises à jour d'état d'un ex utilisateur. (Commentaire: bonjour | nom d'utilisateur: marc) modèle 2: Les noms de restaurant qu'un utilisateur a mangé au (restaurant: KFC | nom d'utilisateur: marc)
J'ai 1 vue qui affiche les sites restaurant générés à partir d'une recherche Google. Une forme cachée est également généré pour chaque restaurant répertorié. Lorsque l'utilisateur appuie sur le « je mangé ici! » bouton, il soumet ce formulaire caché au contrôleur de restaurants, puis le modèle 2, l'enregistrement du nom de l'utilisateur et le restaurant qu'il a mangé à.
Je veux utiliser le « je mangé ici! » bouton pour afficher également une mise à jour d'état du nom du restaurant modèle 1.
cela doit être fait avec fields_for, mais les 2 modèles ne disposent pas d'une relation entre eux .. que je vois ..
Comment puis-je y arriver?
voici mon pastie: http://www.pastie.org/1280923
J'espère que des thats clair!
La solution
Il n'y a pas une telle chose comme « soumet le formulaire à un modèle ». Les formulaires sont toujours soumis à votre contrôleur.
Avec cela à l'esprit, vous pouvez simplement remplacer la méthode de create
ou update
sur votre contrôleur pour effectuer toute action que vous voulez.
Votre contrôleur ressemblera à ceci:
class RestaurantsController < ApplicationController
def update
@restaurant = Restaurant.find(params[:id])
unless @restaurant.update_attributes(params[:restaurant])
# error while saving: warn user, etc
return # stops execution
end
# restaurant was saved ok, do the additional things you want
StatusUpdate.create :user_id => @restaurant.user_id,
:comment => "I just ate @ #{@restaurant.name}"
flash[:notice] = 'Restaurant was successfully updated, and a status update was added.'
redirect_to :action => 'list'
end
end
Cependant, si votre scénario est aussi simple que cela semble, vous pouvez également résoudre ce rappel en utilisant un ActiveRecord sur votre modèle:
class Restaurant < ActiveRecord::Base
after_save :append_status_update
private
def append_status_update
StatusUpdate.create :user_id => self.user_id,
:comment => "I just ate @ #{self.name}"
end
end