Ajax通过jQuery发布到自定义控制器方法不起作用

时间:2011-03-13 00:14:54

标签: ruby-on-rails jquery

我在通过jquery ajax帖子向我的自定义控制器方法发布数据时遇到问题。

我有以下rails 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

通过将控制器从GameController更改为GamesControllor来解决上述问题。

现在收到错误:

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

>

在问题开始时查看我的控制器。

编辑3

修复编辑2非常简单!将网址更改为games_path

2 个答案:

答案 0 :(得分:3)

resources :game为您的控制器设置RESTful路由,自动启用showcreateneweditupdate,和destroy行动。如果您希望它在路径文件中点击test操作,则需要执行此操作:

resource :game do
  member do
    post :test
  end
end

或者,如果您不需要所有其他RESTful路由,则可以执行此操作:

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

那是针对rails 3.在rails 2.3.x中,资源丰富的方式是这样的:

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

我相信

Rails还希望您的控制器以复数格式命名。因此,controllers/games_controller.rb中的文件应该包含class GamesController < ApplicationController作为类内容。

我会重命名文件和/或控制器以匹配约定。但是如果确实需要将其命名为singular,由于某种原因你可以将它添加到你的路径文件中:

资源:游戏,:controller =&gt; '游戏'做   #其他东西在这里 端

我认为这样可以解决它。但人们更常见的是将控制器名称复数化。

答案 1 :(得分:1)

这是因为您的数据类型。这取决于你想要什么样的数据类型,但这是你可以做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 

不要忘记在routes.rb中声明路线:

 map.resources :games