0

我已经重写了我的问题以更准确。我有一个银行账户控制器/模型。

我的控制器上有以下方法

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
4

3 回答 3

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 放置在那里,名称='_method' 和值='PUT'。这就是使您的 POST 确实是 PUT 的原因。您需要从序列化数据中删除它才能正确发布表单。

于 2013-01-10T23:06:55.353 回答
1

URL 需要格式

/bankaccounts/:bankaccount_id/search

错误来自这种方法吗?/bankaccounts/search 可以匹配另一条路线吗?

于 2013-01-10T23:17:43.287 回答
1

如果您希望在/search不指定 id 的情况下使用 url,则应将其声明为collectionaction :

resources :bankaccounts do
  collection do
    post "search"
  end
end

您可以使用rake routes命令检查应用程序中定义的路由,以确保您定义了您的意思。

于 2013-01-10T23:09:07.590 回答