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']}
)
ne fonctionne pas ... Pouvez-vous l'essayer et le voir? – uday
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
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