2009-03-19 5 views
1

Je travaille sur une application Flex/Rails. J'ai un modèle avec une association has_many :through que j'essaie de créer. Je l'ai travaillé avec des cases à cocher sur les pages de rails simples, avec l'aide de blogs comme Paul Barry's has-many-through-checkboxes. Maintenant j'essaye d'obtenir que Flex fasse la même chose et ai de la difficulté sur la manière d'envoyer les paramètres de case à cocher équivalents dans l'appel de service de Flex.Flex -> Rails; comment créer un modèle avec has_many dans un appel de service?

Le modèle en cause se présente comme suit:

class PlayerAction < ActiveRecord::Base 
    belongs_to :player 
    belongs_to :action_type 
    has_many :action_cards 
    has_many :deck_cards, :through => :action_cards 
end 

Le formulaire sur la page rails est la suivante:

<% form_for PlayerAction.new do |f| %> 
    <%= f.hidden_field :player_id, {:value => @player.id} %> 
    <%= f.collection_select(:action_type_id, ActionType.find(:all), :id, :desc) %> 
    <ul> 
     <% @player.hand.deck_cards.each do |deck_card| -%> 
     <li><%= check_box_tag "player_action[deck_card_ids][]", deck_card.id -%><%= deck_card.title %> 
      <% end -%> 
     </ul> 
    <%= f.submit 'Do Action' %> 
<% end %> 

Cela crée des paramètres qui, dans les rails en rondins, ressemble à ceci:

En utilisant le plugin TamperData sur Firefox, les paramètres ressemblent à ceci:
player_action[player_id]=9 
player_action[action_type_id]=1 
player_action[deck_card_ids][]=87 
player_action[deck_card_ids][]=56 
commit=Do+Action 

et enfin, mon code Flex pour l'appel de service est la suivante. svcAction est un mx:HTTPService défini ailleurs. Les travaux de routage et url, je me concentre sur les params ici: Dans le code ci-dessus

svcAction.url = "/player_actions.xml"; 
var params:Object = new Object(); 
params['player_action[action_type_id]'] = 1; 
params['player_action[player_id]'] = 8; 
params['player_action[deck_cards_ids][]'] = 37; 
params['player_action[deck_cards_ids][]'] = 19; 
svcAction.send(params); 

, les player_action[deck_cards_ids][] parms écrasent les uns des autres, alors qu'un seul est envoyé, avec la valeur 2. J'ai aussi essayé tableaux des ids avec

params['player_action[deck_cards_ids]'] = myIdsArray.toString();

et

params['player_action[deck_cards_ids]'] = "[" + myIdsArray.toString() + "]";

, mais aucun des deux travaillé non plus.

Des suggestions?

Répondre

1

j'avais copié l'utilisation de l'objet params dans Flex d'un autre appel de service qui fait une mise à jour (que je Modelé sur des exemples dans le livre Flex on Rails). Jetant un coup d'oeil frais à ceci, j'ai réalisé que c'était une création, ai regardé un autre service de création fonctionnant, et ai fini par créer une demande de xml à la place.

est ici l'extrait de code Flex travail:

var request:XML = 
    <player_action> 
    <player_id>10</player_id> 
    <action_type_id>1</action_type_id> 
    <deck_card_ids>37</deck_card_ids> 
    <deck_card_ids>103</deck_card_ids> 
    </player_action>; 
svcAction.request = request; 
svcAction.send(); 

<mx:HTTPService id="svcAction" url="/player_actions.xml" contentType="application/xml" method="POST" resultFormat="e4x" result="handleActionResult(event)" /> 

Au début, je pensais que je devais le <deck_card_id> niché au sein d'un parent de <deck_card_ids>, mais cela ne fonctionne pas. J'utilise en fait des variables liées et des accolades pour utiliser les valeurs que je veux, mais ce qui précède est le xml qui en résulte.

0

Votre problème est peut-être dans la vue. Au lieu de renvoyer un tableau avec des éléments comme player_action[deck_card_ids][] = 87, il devrait être player_action[deck_card_ids][87] = true.

<ul> 
    <% @player.hand.deck_cards.each do |deck_card| %> 
    <li><%= check_box_tag "player_action[deck_card_ids][#{deck_card.id}]" %><%= deck_card.title %> 
    <% end %> 
</ul> 
+0

La vue fonctionnait bien. Le problème était avec le côté Flex.Je pense que vous avez mal interprété la sortie TamperData. – user26270

+0

Ok. Bonne chance, alors j'espère que vous aurez une meilleure réponse. –

0

Il me semble que votre meilleur pari serait de modifier le contrôleur de Rails de manière à analyser différentes clés de cordes dans vos paramètres. Cela dit, votre contrôleur existant pourrait fonctionner. Essayez d'utiliser params[ new String("player_action[deck_cards_ids][]") ] = [ 37, 19 ];

Questions connexes