向控制器添加自定义路由出错

时间:2013-01-10 23:03:26

标签: ruby-on-rails ruby-on-rails-3 routes

我已经重写了我的问题,以便更加准确。我有一个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

3 个答案:

答案 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匹配另一条路线吗?