出现 "No route matches" 错误,即使我定义了一条路线

Getting "No route matches" error even though I defined a route

我正在使用 Rails 4.2.3。我正在尝试编写一个 AJAX 方法来调用我的控制器中的一个方法,但我收到了一个无路由器错误。在我的咖啡脚本中,我有这个

updateAll = (arg) ->
  object = $('#user_object_object').val()
  day = $('#user_object_day').val()
  $.ajax
    url: "/find_by_user_object_and_day"
    type: 'GET'
    data: {day: day, object: object}
    success: (data) ->
      $('total').val(data)
    error: ->
      alert "Something went wrong"

在我的 config/routes.rb 我有这个

Rails.application.routes.draw do
  resources :user_objects do
    get :find_by_user_object_and_day, on: :collection 
  end

然后在我的“./app/controllers/user_objects_controller.rb”中我有这个

def find_by_user_object_and_day
  Userobject.find_by_user_object_and_day(:params[user], :params[object], :params[day])
end

但是当我的AJAX方法被调用时,这个错误是在服务器上产生的...

F, [2016-02-05T15:52:29.916816 #12058] FATAL -- : 
ActionController::RoutingError (No route matches [GET] "/find_by_user_object_and_day"):
  actionpack (4.2.5) lib/action_dispatch/middleware/debug_exceptions.rb:21:in `call'
  web-console (2.2.1) lib/web_console/middleware.rb:39:in `call'
  actionpack (4.2.5) lib/action_dispatch/middleware/show_exceptions.rb:30:in `call'
  railties (4.2.5) lib/rails/rack/logger.rb:38:in `call_app'
  railties (4.2.5) lib/rails/rack/logger.rb:22:in `call'
  actionpack (4.2.5) lib/action_dispatch/middleware/request_id.rb:21:in `call'
  rack (1.6.4) lib/rack/methodoverride.rb:22:in `call'
  rack (1.6.4) lib/rack/runtime.rb:18:in `call'
  activesupport (4.2.5) lib/active_support/cache/strategy/local_cache_middleware.rb:28:in `call'
  rack (1.6.4) lib/rack/lock.rb:17:in `call'
  actionpack (4.2.5) lib/action_dispatch/middleware/static.rb:116:in `call'
  rack (1.6.4) lib/rack/sendfile.rb:113:in `call'
  railties (4.2.5) lib/rails/engine.rb:518:in `call'
  railties (4.2.5) lib/rails/application.rb:165:in `call'
  rack (1.6.4) lib/rack/lock.rb:17:in `call'
  rack (1.6.4) lib/rack/content_length.rb:15:in `call'
  rack (1.6.4) lib/rack/handler/webrick.rb:88:in `service'
  /Users/davea/.rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/webrick/httpserver.rb:140:in `service'
  /Users/davea/.rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/webrick/httpserver.rb:96:in `run'
  /Users/davea/.rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/webrick/server.rb:296:in `block in start_thread'

当您在资源 'user_objects 中定义路线时,路线将在 /user_objects/find_by_user_object_and_day 可用,而不是 /find_by_user_object_and_day。

如果你希望它能够在根级别 /find_by_user_object_and_day 那么你还需要在根级别定义路由,如下所示:

Rails.application.routes.draw do
  get '/find_by_user_object_and_day', to: 'user_objects#find_by_user_object_and_day'
end

问题是您的路线中有 nested resource,这意味着您将获得嵌套的 url / 路径:

resources :user_objects do
    get :find_by_user_object_and_day, on: :collection #-> url.com/users_objects/:user_object_id/find_by_user_object_and_day
end

由于您必须在 JS 中明确定义路由(它无法知道您希望向哪个 :user_object_id 发送访问者),因此您必须将 ajax#url 值更改为以下:

updateAll = (arg) ->
  user_object_id = $('#user_object').data("id") #-> however you define the id
  object         = $('#user_object_object').val()
  day            = $('#user_object_day').val()
  $.ajax
    url: "user_objects/" +  user_object_id + "/find_by_user_object_and_day"