2012-02-28 2 views
1

Je me demandais si je peux avoir quelque chose comme form_for tag au lieu de la balise html dans la page edit.erb en Rhodes. Parce que j'ai un modèle Counter avec deux attributs que je veux mettre à jour séparément en fonction du bouton pressé qui se trouve juste à côté de la valeur. J'ai pu le faire dans des rails à l'aide du <%= form.submit 'up_a' %> & contrôle qui touche a été pressée dans la méthode de mise à jour, comme:besoin de rails comme form_for tag à Rhodes

def update  
    @counter = Counter.find(params[:id]) 
    if params[:commit] == 'up_a'  
    update_attri1 # simple increment method for attrib 1 
    elsif params[:commit] == 'up_b'  
    update_attri2 # simple increment method for attrib 2 
    end 
end 

et appeler cette méthode pour mettre à jour cette valeur.

Donc je veux avoir plus de contrôle sur ce que je veux mettre à jour attrib sur les clics dans le formulaire. Y at-il de toute façon que je puisse y parvenir à Rhodes?

Répondre

1

EDIT:

Le problème général semble être que vous voulez deux boutons de soumission en une seule forme, chacun doit faire deux choses légèrement différentes. Dans le cas où vous n'avez que deux valeurs différentes et un bouton d'envoi pour chacune, la solution la plus simple serait simplement de faire deux formes qui appellent toutes les deux update def (grâce à leur attribut d'action), mais chacune avec leur spécifique valeur du paramètre de requête (dans ce cas "commit"). Ces appels auraient la forme suivante:

<form method="POST" class="myForm" action="<%=url_for :controller => :Counter, :action => :update, :query => {:commit => 'up_a'}%>"> 

Cependant, si vous voulez qu'une forme simple (peut-être aussi avec beaucoup d'autres valeurs d'entrée), il existe plusieurs façons de le faire. Dans ce qui suit, vous verrez une implémentation détaillée d'une façon de le faire.

Dans cette solution, vos boutons ne doivent PAS être des boutons de soumission, mais des boutons normaux (exactement comment ils sont créés avec jQuery Mobile).

Pour que cette solution fonctionne, vous devez utiliser du javascript. Vous devez donc ajouter les fonctions javascript suivantes à votre application.js et l'inclure dans votre layout.erb.

function submitForm(formClass){ 
    var activeForm = 'div.ui-page-active '+formClass; 
    $(activeForm).submit(); 
} 
function callCounterSetUpdateAction(c){ 
    $.get('/app/Counter/setUpdateAction', { commit: c}); 
} 

Maintenant que nous avons le besoin des fonctions javascript en place, permet de jeter un oeil à edit.erb.

Dans cet exemple, Counter a trois attributs différents: a, b et c. Cependant, nous ne ferons attention qu'à a et b pour commencer.

La forme dans votre fichier edit.erb devrait être similaire à la mise en œuvre ci-dessous. Notez que le formulaire n'a pas de bouton d'envoi (comme nous le verrons plus tard, l'envoi est effectué via notre fonction javascript submitForm(formClass)).

<form method="POST" class="myForm" action="<%= url_for :action => :update %>"> 
    <input type="hidden" name="id" value="<%= @counter.object %>"/> 

     <div data-role="fieldcontain"> 
     <label for="counter[a]" class="fieldLabel">A</label> 
     <input type="text" id="counter[a]" name="counter[a]" value="<%= @counter.a %>" <%= placeholder("A") %> /> 
     </div> 

     <div data-role="fieldcontain"> 
     <label for="counter[b]" class="fieldLabel">B</label> 
     <input type="text" id="counter[b]" name="counter[b]" value="<%= @counter.b %>" <%= placeholder("B") %> /> 
     </div> 

     <div data-role="fieldcontain"> 
     <label for="counter[c]" class="fieldLabel">C</label> 
     <input type="text" id="counter[c]" name="counter[c]" value="<%= @counter.c %>" <%= placeholder("C") %> /> 
     </div> 
     <a data-role="button" data-transition="none" href="javascript:callCounterSetUpdateAction('up_a');">Update A</a> 
     <a data-role="button" data-transition="none" href="javascript:callCounterSetUpdateAction('up_b');">Update B</a> 
</form> 

Maintenant que nous avons défini notre point de vue (edit.erb) permet de jeter un regard sur les définitions que nous devons notre contrôleur.

Firsly, comme on peut voir à partir de l'attribut href sur les boutons, ce qui se passe en réalité une fois que nous appuyer sur un bouton est qu'il appelle une fonction javascript qui appelle à son tour la def suivante dans le contrôleur:

def setUpdateAction 
    $pressedButton = @params['commit'] 
    WebView.execute_js("submitForm('.myForm');") 
end 

Le but de ce def est de stocker le paramètre que nous avons envoyé depuis notre bouton, puis de soumettre le formulaire sur la page active. Notez ici que nous avons ajouté un class appelé myForm au formulaire ci-dessus. Vous devez également remarquer que nous nous assurons que seul le formulaire sur la page active est sélectionné en ajoutant 'div.ui-page-active ' à notre formClass dans la sélection jQuery.

Enfin, permet de jeter un oeil à la façon dont votre définition update devrait ressembler à:

def update 
@counter = Counter.find(@params['id']) 
c = @params['counter'] 
if @counter 
    if $pressedButton == 'up_a' 
    # Update value A. 
    @counter.update_attributes(
     {"a" => c['a']} 
    ) 
    elsif $pressedButton == 'up_b' 
    # Update value B. 
    @counter.update_attributes(
       {"b" => c['b']} 
      ) 
    end 
end 
redirect :action => :index 
end 

Il faut noter ici que nous choisissons qui attribue à la mise à jour en fonction de la variable $pressedButton nous avons attribué par setUpdateAction. Comme dernier commentaire, nous pouvons également mettre à jour plusieurs attributs comme indiqué ci-dessous (où nous mettons également à jour l'attribut 'c').

@counter.update_attributes(
       {"b" => c['b'],"c" => c['c']} 
      ) 
+0

ne fonctionne pas ... Pouvez-vous l'essayer et le voir? – uday

+0

Recevez-vous le paramètre dans votre 'def'? Si c'est le cas, vous devrez peut-être seulement actualiser votre page. Dans les deux cas, votre [ici] (https://github.com/rhomobile/rhomobile-docs/blob/master/docs/rhodes/application.txt) est une référence à certaines méthodes avancées d'utilisation: url_for et: link_to statements. – corthmann

+0

Si vous avez besoin d'actualiser votre page et que vous voulez l'éviter, vous pouvez écrire une simple fonction javascript que vous pouvez exécuter avec les paramètres directement depuis votre contrôleur: 'WebView.execute_js (" incrementField ('a'); ") '. – corthmann