我正在尝试添加一个Ajax,在单击div时将呈现部分内容。

该链接:

<h1 id="comments_viewall"><%= link_to "View All", videos_update_comments_path, remote: true%></h1>


我在视频控制器中有自定义方法:

def update_comments
    puts "hello"
end


路线是这样的:

get 'videos/update_comments'


但是,我收到此错误:

GET http://localhost:3000/videos/update_comments 404 (Not Found)

Started GET "/videos/update_comments" for 127.0.0.1 at 2014-05-05 13:49:02 -0400
Processing by VideosController#show as JS
  Parameters: {"id"=>"update_comments"}
  User Load (0.1ms)  SELECT "users".* FROM "users" WHERE "users"."id" = 1 ORDER BY "users"."id" ASC LIMIT 1
 in show
  Video Load (0.1ms)  SELECT "videos".* FROM "videos" WHERE "videos"."id" = ? LIMIT 1  [["id", "update_comments"]]
 Completed 404 Not Found in 2ms

ActiveRecord::RecordNotFound (Couldn't find Video with id=update_comments):
  app/controllers/videos_controller.rb:94:in `show'


我遵循了堆栈溢出问题告诉我的操作,但仍然无法正常工作。

最佳答案

get 'videos/update_comments'移到为show资源定义的videos路由上方。

例如:

get 'videos/update_comments'
resources :videos


与当前一样,当您对videos/update_comments进行GET请求时,Rails从route.rb查找第一个匹配项,并将请求路由到那里。因此,它匹配videos/:id路由并将请求路由到VideosController#show操作而不是VideosController#update_comments

您可以在生成的日志中清楚地看到它

Started GET "/videos/update_comments" for 127.0.0.1 at 2014-05-05 13:49:02 -0400
Processing by VideosController#show as JS


通过将update_comments路径移动到show路径之前,每当对videos/update_comments进行GET请求时,第一个匹配项将在您的路径中是get 'videos/update_comments',并且该请求将被定向到VideosController#update_comments

更新

您也可以按照@Addicted在注释中的建议,在update_comments中定义collection路由,前提是您已使用resources :videos定义了路由

  resources :videos do
    collection do
      get 'update_comments'
    end
  end

关于javascript - 路由到 Controller 中的自定义 Action ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23478660/

10-12 23:23