Flex -> Rails; Как создать модель с has_many в одном вызове службы? - PullRequest
1 голос
/ 19 марта 2009

Я работаю над приложением Flex / Rails. У меня есть модель с has_many :through ассоциацией, которую я пытаюсь создать. Я работаю с флажками на страницах с обычными рельсами, с помощью блогов, таких как флажки «Пол много через *» Пола Барри . Теперь я пытаюсь заставить Flex делать то же самое, и у меня возникают трудности с отправкой эквивалентных пар флажков в служебном вызове Flex.

Модель выглядит следующим образом:

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

Форма на странице рельсов:

<% 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 %>

Это создает параметры, которые в журнале рельсов выглядят так:

Parameters: {"commit"=>"Do Action", "action"=>"create", "controller"=>"player_actions", "player_action"=>{"action_type_id"=>"1", "player_id"=>"9", "deck_card_ids"=>["87", "56"]}}

Используя плагин TamperData в Firefox, параметры выглядят так:

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

и, наконец, мой код Flex для служебного вызова выглядит следующим образом. svcAction - это mx:HTTPService, определенный в другом месте. Маршрутизация и URL работают, я сосредотачиваюсь на параметрах здесь:

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);

В приведенном выше коде player_action[deck_cards_ids][] пармы перезаписывают друг друга, поэтому отправляется только один со вторым значением. Я также пробовал массивы идентификаторов с

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

и

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

но ни один из них не сработал.

Есть предложения?

Ответы [ 3 ]

1 голос
/ 19 марта 2009

Я скопировал использование объекта params в Flex из другого вызова службы, который выполняет обновление (которое я смоделировал после примеров в книге Flex on Rails). Взглянув по-новому на это, я понял, что это создание, посмотрел на другую работающую службу создания и в итоге вместо этого создал запрос XML.

Вот рабочий фрагмент кода Flex:

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)" />

Сначала я подумал, что мне нужно <deck_card_id>, вложенное в родительский элемент <deck_card_ids>, но это не сработало. Я на самом деле использую связанные переменные и фигурные скобки, чтобы использовать нужные значения, но выше приведен xml.

0 голосов
/ 19 марта 2009

Мне кажется, что вам лучше всего изменить контроллер Rails, чтобы анализировать разные ключи String в ваших параметрах. Тем не менее, ваш существующий контроллер может работать. Попробуйте использовать params[ new String( "player_action[deck_cards_ids][]" ) ] = [ 37, 19 ];

0 голосов
/ 19 марта 2009

Ваш вопрос может быть в поле зрения. Вместо того, чтобы возвращать массив с элементами типа player_action[deck_card_ids][] = 87, он должен быть 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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...