我已经重写了我的问题,以便更加准确。我有一个bankaccounts控制器/型号。
我的控制器上有以下方法
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
用于呼叫尝试1的Javascript
$.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
答案 0 :(得分:2)
通常,此错误表示您正在发出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放置,名称='_方法'和值='PUT'。这就是令人信服的说你的POST真的是PUT。您需要从序列化数据中删除它才能正确发布表单。
答案 1 :(得分:1)
如果您希望在未指定ID的情况下使用/search
网址,则应将其声明为collection
操作:
resources :bankaccounts do
collection do
post "search"
end
end
您可以使用rake routes
命令检查应用中定义的路线,以确保您定义了您的意思。
答案 2 :(得分:1)
网址需要格式
/bankaccounts/:bankaccount_id/search
错误来自此方法吗?可以/ bankaccounts / search匹配另一条路线吗?