我在通过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):
通过将控制器从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| %
>
在问题开始时查看我的控制器。
修复编辑2非常简单!将网址更改为games_path
答案 0 :(得分:3)
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'
那是针对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