2011-11-16 3 views
1

Dans ma page d'affichage, j'utilise form_tag pour créer un formulaire qui transmet une chaîne d'identificateurs d'un champ masqué au code du contrôleur.Mise à jour des enregistrements dans une base de données à l'aide du formulaire

Dans mon code de contrôleur, je parcourt un tableau d'ID pour mettre à jour chaque enregistrement contenant cet ID dans la table Expression. Mais le code ci-dessous ne semble pas fonctionner. J'apprécierais vraiment si quelqu'un pourrait me donner une suggestion concernant ce qui ne va pas avec le code ci-dessous.

def update_expression 
    @emi_ids_array = params[:emi_ids].split(/,/) 
    @sub_id = params[:sub_id] 

    @emi_ids_array.each do |emi_id| 
    @existing_exp = Expression.find(:first, :conditions => [ "EXT_EMI_ID = ? and EXT_SUB_FK = ?", emi_id, @sub_id]) 
    @expression = @existing_exp.update_attributes(
     :EXT_SUB_FK => @sub_id, 
     :EXT_PRESENCE => "present", 
     :EXT_STRENGTH => "weak", 
     :EXT_EMI_ID => emi_id 
    ) 
    end 
end 
+0

Juste vérifier mais les params correctement transmises à la fonction - peut-être augmente params.inspect pour vérifier. Est-ce Rails 2 ou 3? (Si 3 peut-être modifier l'instruction Expression.find à Expression.where). Expression.find renvoie-t-il des résultats? Essayez-le dans la console avec quelques params connus et relancez inspecter le @existing_exp retourné? – Pasted

+0

Oui, la méthode find renvoie la valeur correcte – tanya

+1

Peut-être essayer les noms de colonnes en minuscules - ne savez pas comment ruby ​​et rails se comportent avec des noms de colonne en majuscule puisqu'ils ne seront pas considérés comme des constantes? Pensez que vous pouvez contourner ce problème en créant vos propres méthodes getter et setter (très anciennes http://snippets.dzone.com/posts/show/2034) ou une variante de Rails 3 (http://stackoverflow.com/questions/ 4605543/rails-3-facilement-travailler-avec-pascal-case-column-names) – Pasted

Répondre

0

Trouvé une solution temporaire. « Update_attributes » ne semble pas fonctionner, donc j'opté pour « update_all attribut »

Expression.update_all({:EXT_PRESENCE => "present", :EXT_STRENGTH => "weak"},['EXT_EMI_ID = ? and EXT_SUB_FK = ?', emi_id, @sub_id]) 

Si tout va bien, il pourrait être utile à quelqu'un d'autre

0

Essayez de convertir le tableau d'ID (et le sub_id) en entiers.

Est-ce la découverte de l'objet qui échoue, ou la mise à jour? Envoyez le @expression.errors après l'appel de mise à jour pour voir si des validations échouent.

Y a-t-il une raison pour toutes les variables d'instance? Vous n'avez pas besoin des @ si la variable ne va pas au-delà de cette méthode. Aussi l'item @expression semble superflu, vous ne faites que dupliquer l'objet @existing_exp, vous n'avez pas besoin de placer le retour dans un nouvel objet, surtout s'il est remplacé à chaque fois que la boucle est exécutée.

+0

Les ID sont sous la forme EMI: 222, donc je peux; t les convertir en entiers. – tanya

+0

Il est capable de trouver l'objet. C'est seulement la mise à jour qui échoue – tanya

Questions connexes