[英]Error adding custom route to controller
為了更准確,我重寫了我的問題。 我有一個銀行帳戶控制器/模型。
我的控制器上有以下方法
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
當我做耙子時,這顯示了以下路線
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
當我做耙子時,這顯示了以下路線
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正在請求SHOW頁以獲取ID = search的銀行帳戶
而
POST / bankaccounts / search可以正確執行您的操作。
編輯:
resources :bankaccounts do
collection do
post "search"
end
end
也是正確的。 現在,我注意到您正在執行此操作來獲取數據:
data: $('#edit_bankaccount_' + bank_account_id).serialize()
該表單中可能包含一個隱藏字段,該字段由rails放置在其中,名稱為“ _method”,值為“ PUT”。 這就是說服您POST實際上是PUT的令人信服的地方。 您需要將其從序列化數據中刪除,以便正確發布表單。
如果要使用/search
網址而不指定ID,則應將其聲明為collection
操作:
resources :bankaccounts do
collection do
post "search"
end
end
您可以使用rake routes
命令檢查應用程序中定義的rake routes
,以確保定義了您想要的內容。
網址為預期格式
/bankaccounts/:bankaccount_id/search
錯誤是否來自此方法? / bankaccounts / search是否可以匹配其他路線?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.