2010-06-13 4 views
0

J'ai un champ booléen appelé "enregistré" dans ma base de données. Je veux basculer ce champ en cliquant sur un lien texte qui passe de "Enregistrer" à "Unsave" en fonction de la situation, et met à jour ma table "Client" avec 0 ou 1. Je suppose que Javascript peut être un moyen d'aller pour cela mais je ne suis pas assez expérimenté (encore!) en Javascript pour savoir comment le coder. J'ai annulé la question pour la raccourcir. Voici mon code exact.Rails: comment basculer un champ booléen d'une vue?

#employers controller 
def save_toggle 
    @matching = Matching.find(params[:id]) 
    if @matching.employer_stars == false 
    @matching.employer_rejects = false # If saving a match, remove any existing rejection. 
    end 
    @matching.employer_stars = [email protected]_stars 
    @matching.save 
    render :partial => "save_unsave_buttons", :layout => false 
end 

#view home.html.erb 
<%= render :partial => "save_unsave_buttons", :locals => {:matching => matching} %> 

#partial _save_unsave_buttons.html.erb 
<div id="save_buttons" class="buttonText"> #latter is just for CSS layout 
    <% if @matching.employer_stars %> 
    <%= link_to_remote "Unsave", 
     :url => {:action => "save_toggle", :id => matching.id}, 
     :update => {:success => "save_buttons", :failure => "Error"} %> 
    <% else %> 
    <%= link_to_remote "Save", 
     :url => {:action => "save_toggle", :id => matching.id}, 
     :update => {:success => "save_buttons", :failure => "Error"} %> 
    <% end %> 
</div> 

La base de données fonctionne mais le texte à bascule ne bascule pas. À @nathanvda: Je suis vraiment désolé d'avoir été si mal - je veux confirmer votre réponse, mais je sais que si je le fais, je laisserai cela pendant un moment, puis je reviendrai et je serai de nouveau frustré! Merci mec.

Répondre

1

Vous devez définir une méthode de contrôleur, qui définit votre attribut saved. À votre avis, vous pouvez alors lier à cette méthode en utilisant link_to_remote.

Cela devrait vous aider à démarrer.

--update: après mise à jour question:

Vous devez créer une partie qui rend votre bouton d'enregistrement/unsave comme ceci, appelez-le "_save_unsave_buttons.html.erb":

<div id="save_buttons"> 
    <% if matching.employer_stars %> 
    <%= link_to_remote "Unsave", 
     :url => {:action => "save_toggle", :id => matching.id}, 
     :update => {:success => "save_buttons", :failure => "Error"} %> 
    <% else %> 
    <%= link_to_remote "Save", 
     :url => {:action => "save_toggle", :id => matching.id}, 
     :update => {:success => "save_buttons", :failure => "Error"} %> 
    <% end %> 
</div> 

Cette partie vous rendra les boutons de sauvegarde corrects, et lors de la mise à jour, le div contenant est mis à jour/remplacé par le résultat de votre action de contrôleur.

De l'intérieur de votre écran principal, écrire

<%= render :partial => "save_unsave_buttons", :locals => {:matching => match } %> 

où vous voulez que les boutons soient visibles.

Et à l'intérieur de votre contrôleur:

def save_toggle 
    @matching = Matching.find(params[:id]) 
    @matching.employer_stars = [email protected]_stars 
    @matching.save 
    render :partial => "save_unsave_buttons", :locals => {:matching => @matching}, :layout => false 
end 

Bonne chance! - Mise à jour à nouveau: donc je présume que vous rendez un ensemble de @matchings, je changerais un peu le nom entre la collection et l'élément, pour éviter plus de confusion et de fautes de frappe accidentelles.

Mais en réalité, cela est assez facile:

@matchings.each do |match| 
    .. build your view here .. 
    <%= render :partial => "save_unsave_buttons", :locals => {:matching => match} 
end 

et dans votre partie, vous pouvez alors utiliser la matching correcte partout.

+0

Salut @nathanvda, merci pour les commentaires. J'ai mis à jour ma question ci-dessus. – sscirrus

+0

Salut @sscirrus: j'ai mis à jour ma réponse en conséquence. J'espère que c'est plus clair maintenant? – nathanvda

+0

Salut @nathanvda: Je suis presque là. Juste une dernière erreur à passer - j'avais besoin d'ajouter: les locaux appellent le partiel pour qu'il reconnaisse 'matching'. Mais, les bascules ne fonctionnent pas. Voir ma mise à jour pour plus de détails. Je vous ai donné un 1+ jusqu'à présent, et merci. – sscirrus

1

Juste un avis:

Votre méthode save_toggle n'est pas RESTful. Le verbe HTTP PUT doit être implémenté idempotent (voir o.a. http://en.wikipedia.org/wiki/Idempotence#Examples), ce qui signifie qu'il doit toujours faire la même chose, peu importe la fréquence à laquelle vous l'exécutez. Dans votre exemple, l'exécution de la méthode save_toggle une fois ne donne pas le même résultat que l'exécution deux fois.

Une meilleure pratique serait de faire deux méthodes, par exemple .:

def set_employer_stars 
end 

def unset_employer_stars 
end 

ou tout ce que vous voulez les appeler.Ensuite, vous pouvez également utiliser ces deux méthodes différentes dans les méthodes link_to_remote (parce que vous utilisez maintenant save_toggle dans "Unsave" et "Save").

+0

Merci beaucoup pour votre commentaire Van der Hoorn. Je vais le prendre à bord. – sscirrus

Questions connexes