Публикация Ajax через jQuery на метод нестандартного контроллера не работает - PullRequest
2 голосов
/ 13 марта 2011

У меня проблема с отправкой данных в мои пользовательские методы контроллера через сообщение jquery ajax.

У меня есть следующие рельсы myPlayer.erb.html:

<% form_for @playersonline, :url =>  game_index_path, :html => { :method => :put, :class => "block", :id => "playersOnline_form" } do |f| %>

        <% @playersonline.each do |member| %>

          <li>
            <div class="playerDetails">
              <div class="playerNickname"><%= member.nickname %></div>
              <div class="playerPlayLink">
                <input type="button" class="submit_button playPlayer" id="<%= member.nickname %>" value="Play" />
              </div>
            </div>
          </li>

        <% end %>

        <p class="morePlayers">  
          <a href="">View more players >></a>
        </p>

      <% end %>

HTML-формы выглядит так:

<form accept-charset="UTF-8" action="/game" class="block" id="playersOnline_form" method="post">

И следующий код jQuery, который прикрепляет обработчики событий к каждой кнопке.

SITE.Game = function() {

  $('.playPlayer').live('click', 
    function() { 
      SITE.Game.sendGameRequest() 
    } 
  );
}

SITE.Game.sendGameRequest = function() {

  $.post('/game/test,{"testData": "One", "testDataAgain": "Two"}, function(result) { console.log("data returned = " + result); }, "json")

} 

Поэтому, когда я нажимаю кнопку, и событие запускается при выполнении запроса ajax, я получаю следующую ошибку:

Started POST "/game/test" for 127.0.0.1 at 2011-03-13 00:05:59 +0000

ActionController::RoutingError (No route matches "/game/test"):

Мой контроллер выглядит следующим образом, и по выводу сервера я вижу, что он не входит в мой метод тестирования:

class GameController < ApplicationController

  def test
    puts "---------------------------"
    puts "GAME TEST WORKING"
    puts "---------------------------"  
  end

  def index  

    @returnMember = ["Tom","Pete"]

    respond_to do |format|
      format.json { render :json => @returnMember.to_json }
    end
  end

end

В моих маршрутах также есть следующее:

resources :game

Есть идеи, где я иду не так?

РЕДАКТИРОВАТЬ

В ответ на nzifnab ответить.Я добавил:

resource :game do
  member do
    post 'test'
  end
end

Но теперь получаю:

ActionController::RoutingError (uninitialized constant GamesController):

РЕДАКТИРОВАТЬ 2

Исправлено выше, если сменить контроллер на GamesControllor из GameController.

Теперь получаю ошибку:

undefined local variable or method `games_index_path'
    <% form_for @playersonline, :url =>  games_index_path, :html => { :method => :put, :class => "block", :id => "playersOnline_form" } do |f| %

>

Смотрите мой контроллер в начале выпуска.

EDIT 3

Исправить для Edit 2 довольно просто!URL изменен на games_path

Ответы [ 2 ]

3 голосов
/ 13 марта 2011

resources :game устанавливает маршрут RESTful для вашего контроллера, который автоматически включает действия show, create, new, edit, update и destroy. Если вы хотите, чтобы он выполнял действие test, вам нужно сделать это в файле маршрутов:

resource :game do
  member do
    post :test
  end
end

Или, если вам не нужны все эти другие маршруты RESTful, вы можете сделать это:

match 'game/test' => 'game#test'

Это для рельсов 3. В рельсах 2.3.x находчивый способ будет выглядеть так:

resource :game, :members => {:test => :post}

Я верю

Rails также ожидает, что ваши контроллеры будут названы в формате множественного числа. Поэтому файл в controllers/games_controller.rb должен иметь class GamesController < ApplicationController в качестве содержимого класса.

Я бы просто переименовал файл и / или контроллер в соответствии с соглашением. Но если вам действительно нужно по какой-то причине оставить имя в единственном числе, вы можете добавить его в свой файл маршрутов:

resource: game,: controller => 'game' do # Другие вещи здесь конец

Я думаю, это исправит это. Но для людей более привычно просто называть имена своих контроллеров.

1 голос
/ 13 марта 2011

Это из-за вашего типа данных. Это зависит от того, какой тип данных вы хотите, но вот как вы можете сделать html и json:

Пример JSON:

 SITE.Game.sendGameRequest = function() {
  $.post('/game/test.json,{"testData": "One", "testDataAgain": "Two"}, function(result) {
     console.log("data returned = " + result); }, "json")
} 

И HTML:

SITE.Game.sendGameRequest = function () {

  $.post('/game/test.html,{"testData": "One", "testDataAgain": "Two"}, function(result) { console.log("data returned = " + result); }, "html")

} 

тогда в вашем контроллере нужно проверить формат:

class GameController < ApplicationController
  def test
      responds_to |format|
          format.html #need for ajax with html datatype 
          format.json #need for ajax with json datatype
      end
  end
end

Журнал изменений:

[changed] the paths for your ajax request
[added] responds_to helper in your controller 

И не забудьте объявить маршрут в ваших маршрутах. Rb:

 map.resources :games
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...