为了更准确,我重写了我的问题。我有一个银行账户控制器/模型。
我有以下方法在我的控制器
def search
#@ledgeritems = Ledgeritem.where("bankaccount_id = ? and transactiondate >= ? and transactiondate < ?", params[:bankaccount_id], params[:startdate], params[:enddate])
@bankaccount = Bankaccount.find(params[:bankaccount_id])
respond_to do |format|
format.js { render :partial => "bankaccount/bankledger" }
end
end
我已经试了两次调用这个。
尝试1
尝试1的路由
resources :bankaccounts do
post "search"
end
这显示了当我执行rake
时的以下路由bankaccount_search POST /bankaccounts/:bankaccount_id/search(.:format) bankaccounts#search
Javascript调用尝试1
$.ajax({
type: "POST",
url: "/bankaccounts/" + bank_account_id + "/search.js",
data: $('#edit_bankaccount_' + bank_account_id).serialize(),
success: function (result, status) {
$('#bank_ledger_div').html(result);
}
});
这在我的控制器上调用了正确的路由,但服务器将其视为PUT而不是POST,并返回404。
尝试2
尝试2的路由
resources :bankaccounts do
collection do
post "search"
end
end
这显示了当我执行rake
时的以下路由search_bankaccounts POST /bankaccounts/search(.:format) bankaccounts#search
调用尝试2的Javascript
$.ajax({
type: "POST",
url: "/bankaccounts/search.js",
data: $('#edit_bankaccount_' + bank_account_id).serialize(),
success: function (result, status) {
$('#bank_ledger_div').html(result);
}
});
调用更新路由,但仍然显示为PUT命令。在Firebug中,我看到一个500错误,结果如下
Couldn't find Bankaccount with id=search
通常此错误表示您正在发出GET请求而不是POST请求。
例如:假设GET/bankaccounts/search请求ID = search
的银行账户的SHOW页面,
POST/bankaccounts/search会正确地命中你的动作。
编辑:resources :bankaccounts do
collection do
post "search"
end
end
也是正确的。现在我注意到您正在这样做以获取数据:
data: $('#edit_bankaccount_' + bank_account_id).serialize()
表单中可能有一个隐藏字段,由rails放置在那里,name='_method'和value=' put '。这就是让rails相信您的POST实际上是PUT的原因。为了正确发布表单,您需要从序列化数据中删除它。
如果您希望在不指定id的情况下使用/search
url,您应该将其声明为collection
操作:
resources :bankaccounts do
collection do
post "search"
end
end
你可以用rake routes
命令检查你的应用程序中定义的路由,以确保你定义了你的意思
URL期望的格式为
/bankaccounts/:bankaccount_id/search
错误来自这个方法吗?/银行账户/搜索是否匹配另一条路径?