对Rails来说很新,并且按照入门教程(创建一个Blog),destroy方法给了我一个错误

时间:2017-06-18 20:17:42

标签: jquery ruby-on-rails ruby

我已经阅读了很多关于这个问题的SO帖子和Team Tree House帖子,但是还没有能够解决它。

点击“删除”按钮后它告诉我'动作'显示'无法找到TodoItemsController'

根据一些回复,我尝试了以下内容:

确保gem' jquery-rails'在gemfile中,jquery_ujs包含在app / assets / javascripts / application.js文件中

//= require jquery
//= require jquery_ujs

确保布局中的部分包含以下内容:

<%= javascript_include_tag :defaults %>
<%= csrf_meta_tag %>

这是我在todo_items_controller.rb中的destroy方法

def destroy
  @todo_item = @todo_list.todo_items.find(params[:id])  
  if @todo_item.destroy
    flash[:success] = "Todo List item was deleted."
  else
    flash[:error] = "Todo List item could not be deleted."
  end
  redirect_to @todo_list
end

这是我的删除&#39;链接_todo_item.html.erb

<%= link_to 'Delete', todo_list_todo_item_path(@todo_list, todo_item.id), 
method: :delete, data: { confirm: "Are you sure?" } %>

这是我在todo_lists中的show.html.erb文件

<p id="notice"><%= notice %></p>

<p>
  <strong>Title:</strong>
  <%= @todo_list.title %>
</p>

<p>
  <strong>Description:</strong>
  <%= @todo_list.description %>
</p>

<div id="todo_items_wrapper">
  <%= render @todo_list.todo_items %>
  <div id="form">
    <%= render "todo_items/form" %>
  </div>
</div>

<%= link_to 'Edit', edit_todo_list_path(@todo_list) %> |
<%= link_to 'Back', todo_lists_path %>

这是我的routes.rb文件

Rails.application.routes.draw do
  resources :todo_lists do
    resources :todo_items
  end
  root "todo_lists#index"
end

我不确定还包括哪些内容。任何帮助都表示赞赏,因为这是我第一次尝试创建rails应用程序。

由于

这里要求的是我完整的控制器文件:

    class TodoItemsController < ApplicationController
    before_action :set_todo_list

    def create
      @todo_item = @todo_list.todo_items.create(todo_item_params)
      redirect_to @todo_list
    end

    def destroy
      @todo_item = @todo_list.todo_items.find(params[:id])  
      if @todo_item.destroy
        flash[:success] = "Todo List item was deleted."
      else
        flash[:error] = "Todo List item could not be deleted."
      end
      redirect_to @todo_list
    end

    private

    def set_todo_list
        @todo_list = TodoList.find(params[:todo_list_id])
    end

    def todo_item_params
        params[:todo_item].permit(:content)
    end
end

一旦我将以下代码添加到private上方的控制器,这里请求的是我的错误消息:

   def show
    @todo_list = TodoList.find(params[:todo_list_id])
   end

错误讯息:

Missing template todo_items/show, application/show with {:locale=>[:en], 
:formats=>[:html], :variants=>[], :handlers=>[:erb, :builder, :raw, :ruby, 
:coffee, :jbuilder]}. Searched in: * 
"C:/Users/david/OneDrive/Documents/Ruby/todo/todo/app/views"


Posting error response when trying to delete when `show` method is included 
in controller:

Template is missing
Missing template todo_items/show, application/show with {:locale=>[:en], 
:formats=>[:html], :variants=>[], :handlers=>[:erb, :builder, :raw, :ruby, 
:coffee, :jbuilder]}. Searched in: * 
"C:/Users/david/OneDrive/Documents/Ruby/todo/todo/app/views"

Rails.root: C:/Users/david/OneDrive/Documents/Ruby/todo/todo

Application Trace | Framework Trace | Full Trace
actionview (4.2.8) lib/action_view/path_set.rb:46:in `find'
actionview (4.2.8) lib/action_view/lookup_context.rb:121:in `find'
C:in `find_template'
actionview (4.2.8) lib/action_view/renderer/template_renderer.rb:40:in `determine_template'
actionview (4.2.8) lib/action_view/renderer/template_renderer.rb:8:in `render'
actionview (4.2.8) lib/action_view/renderer/renderer.rb:46:in `render_template'
actionview (4.2.8) lib/action_view/renderer/renderer.rb:27:in `render'
actionview (4.2.8) lib/action_view/rendering.rb:100:in `_render_template'
actionpack (4.2.8) lib/action_controller/metal/streaming.rb:217:in `_render_template'
actionview (4.2.8) lib/action_view/rendering.rb:83:in `render_to_body'
actionpack (4.2.8) lib/action_controller/metal/rendering.rb:32:in `render_to_body'
actionpack (4.2.8) lib/action_controller/metal/renderers.rb:37:in `render_to_body'
actionpack (4.2.8) lib/abstract_controller/rendering.rb:25:in `render'
actionpack (4.2.8) lib/action_controller/metal/rendering.rb:16:in `render'
actionpack (4.2.8) lib/action_controller/metal/instrumentation.rb:44:in `block (2 levels) in render'
activesupport (4.2.8) lib/active_support/core_ext/benchmark.rb:12:in `block in ms'
C:/Ruby22/lib/ruby/2.2.0/benchmark.rb:303:in `realtime'
activesupport (4.2.8) lib/active_support/core_ext/benchmark.rb:12:in `ms'
actionpack (4.2.8) lib/action_controller/metal/instrumentation.rb:44:in `block in render'
actionpack (4.2.8) lib/action_controller/metal/instrumentation.rb:87:in `cleanup_view_runtime'
activerecord (4.2.8) lib/active_record/railties/controller_runtime.rb:25:in `cleanup_view_runtime'
actionpack (4.2.8) lib/action_controller/metal/instrumentation.rb:43:in `render'
actionpack (4.2.8) lib/action_controller/metal/implicit_render.rb:10:in `default_render'
actionpack (4.2.8) lib/action_controller/metal/implicit_render.rb:5:in `send_action'
actionpack (4.2.8) lib/abstract_controller/base.rb:198:in `process_action'
actionpack (4.2.8) lib/action_controller/metal/rendering.rb:10:in `process_action'
actionpack (4.2.8) lib/abstract_controller/callbacks.rb:20:in `block in process_action'
activesupport (4.2.8) lib/active_support/callbacks.rb:117:in `call'
activesupport (4.2.8) lib/active_support/callbacks.rb:117:in `call'
activesupport (4.2.8) lib/active_support/callbacks.rb:555:in `block (2 levels) in compile'
activesupport (4.2.8) lib/active_support/callbacks.rb:505:in `call'
activesupport (4.2.8) lib/active_support/callbacks.rb:505:in `call'
activesupport (4.2.8) lib/active_support/callbacks.rb:92:in `__run_callbacks__'
activesupport (4.2.8) lib/active_support/callbacks.rb:778:in `_run_process_action_callbacks'
activesupport (4.2.8) lib/active_support/callbacks.rb:81:in `run_callbacks'
actionpack (4.2.8) lib/abstract_controller/callbacks.rb:19:in `process_action'
actionpack (4.2.8) lib/action_controller/metal/rescue.rb:29:in `process_action'
actionpack (4.2.8) lib/action_controller/metal/instrumentation.rb:32:in `block in process_action'
activesupport (4.2.8) lib/active_support/notifications.rb:164:in `block in instrument'
activesupport (4.2.8) lib/active_support/notifications/instrumenter.rb:20:in `instrument'
activesupport (4.2.8) lib/active_support/notifications.rb:164:in `instrument'
actionpack (4.2.8) lib/action_controller/metal/instrumentation.rb:30:in `process_action'
actionpack (4.2.8) lib/action_controller/metal/params_wrapper.rb:250:in `process_action'
activerecord (4.2.8) lib/active_record/railties/controller_runtime.rb:18:in `process_action'
actionpack (4.2.8) lib/abstract_controller/base.rb:137:in `process'
actionview (4.2.8) lib/action_view/rendering.rb:30:in `process'
actionpack (4.2.8) lib/action_controller/metal.rb:196:in `dispatch'
actionpack (4.2.8) lib/action_controller/metal/rack_delegation.rb:13:in `dispatch'
actionpack (4.2.8) lib/action_controller/metal.rb:237:in `block in action'
actionpack (4.2.8) lib/action_dispatch/routing/route_set.rb:74:in `call'
actionpack (4.2.8) lib/action_dispatch/routing/route_set.rb:74:in `dispatch'
actionpack (4.2.8) lib/action_dispatch/routing/route_set.rb:43:in `serve'
actionpack (4.2.8) lib/action_dispatch/journey/router.rb:43:in `block in serve'
actionpack (4.2.8) lib/action_dispatch/journey/router.rb:30:in `each'
actionpack (4.2.8) lib/action_dispatch/journey/router.rb:30:in `serve'
actionpack (4.2.8) lib/action_dispatch/routing/route_set.rb:817:in `call'
rack (1.6.8) lib/rack/etag.rb:24:in `call'
rack (1.6.8) lib/rack/conditionalget.rb:25:in `call'
rack (1.6.8) lib/rack/head.rb:13:in `call'
actionpack (4.2.8) lib/action_dispatch/middleware/params_parser.rb:27:in `call'
actionpack (4.2.8) lib/action_dispatch/middleware/flash.rb:260:in `call'
rack (1.6.8) lib/rack/session/abstract/id.rb:225:in `context'
rack (1.6.8) lib/rack/session/abstract/id.rb:220:in `call'
actionpack (4.2.8) lib/action_dispatch/middleware/cookies.rb:560:in `call'
activerecord (4.2.8) lib/active_record/query_cache.rb:36:in `call'
activerecord (4.2.8) lib/active_record/connection_adapters/abstract/connection_pool.rb:653:in `call'
activerecord (4.2.8) lib/active_record/migration.rb:377:in `call'
actionpack (4.2.8) lib/action_dispatch/middleware/callbacks.rb:29:in `block in call'
activesupport (4.2.8) lib/active_support/callbacks.rb:88:in `__run_callbacks__'
activesupport (4.2.8) lib/active_support/callbacks.rb:778:in `_run_call_callbacks'
activesupport (4.2.8) lib/active_support/callbacks.rb:81:in `run_callbacks'
actionpack (4.2.8) lib/action_dispatch/middleware/callbacks.rb:27:in `call'
actionpack (4.2.8) lib/action_dispatch/middleware/reloader.rb:73:in `call'
actionpack (4.2.8) lib/action_dispatch/middleware/remote_ip.rb:78:in `call'
actionpack (4.2.8) lib/action_dispatch/middleware/debug_exceptions.rb:17:in `call'
web-console (2.3.0) lib/web_console/middleware.rb:28:in `block in call'
web-console (2.3.0) lib/web_console/middleware.rb:18:in `catch'
web-console (2.3.0) lib/web_console/middleware.rb:18:in `call'
actionpack (4.2.8) lib/action_dispatch/middleware/show_exceptions.rb:30:in `call'
railties (4.2.8) lib/rails/rack/logger.rb:38:in `call_app'
railties (4.2.8) lib/rails/rack/logger.rb:20:in `block in call'
activesupport (4.2.8) lib/active_support/tagged_logging.rb:68:in `block in tagged'
activesupport (4.2.8) lib/active_support/tagged_logging.rb:26:in `tagged'
activesupport (4.2.8) lib/active_support/tagged_logging.rb:68:in `tagged'
railties (4.2.8) lib/rails/rack/logger.rb:20:in `call'
actionpack (4.2.8) lib/action_dispatch/middleware/request_id.rb:21:in `call'
rack (1.6.8) lib/rack/methodoverride.rb:22:in `call'
rack (1.6.8) lib/rack/runtime.rb:18:in `call'
activesupport (4.2.8) lib/active_support/cache/strategy/local_cache_middleware.rb:28:in `call'
rack (1.6.8) lib/rack/lock.rb:17:in `call'
actionpack (4.2.8) lib/action_dispatch/middleware/static.rb:120:in `call'
rack (1.6.8) lib/rack/sendfile.rb:113:in `call'
railties (4.2.8) lib/rails/engine.rb:518:in `call'
railties (4.2.8) lib/rails/application.rb:165:in `call'
rack (1.6.8) lib/rack/lock.rb:17:in `call'
rack (1.6.8) lib/rack/content_length.rb:15:in `call'
rack (1.6.8) lib/rack/handler/webrick.rb:88:in `service'
C:/Ruby22/lib/ruby/2.2.0/webrick/httpserver.rb:138:in `service'
C:/Ruby22/lib/ruby/2.2.0/webrick/httpserver.rb:94:in `run'
C:/Ruby22/lib/ruby/2.2.0/webrick/server.rb:294:in `block in start_thread'
Request

Parameters:

{"todo_list_id"=>"1",
 "id"=>"1"}

3 个答案:

答案 0 :(得分:1)

所以它通过进入application.html.rb文件修复了这个问题。

我换了:

%= stylesheet_link_tag :default, media: 'all', 'data-turbolinks-track' => true %>
<%= javascript_include_tag :default %>

为:

%= stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track' => true %>
<%= javascript_include_tag 'application' %>

一切正常。

感谢您的帮助。

答案 1 :(得分:0)

您可以检查项目是否被正确删除?如果它没有被删除,那么: 我认为你需要一个&#34;形式&#34;而不是link_to。

link_to会创建一个<a>代码,如果我没有弄错,您可以正确地执行&#34;删除&#34;。

使用:form_for @YOUROBJECT, method: :delete do |f|

这就是为什么它说它没有找到&#34; show&#34;控制器上的操作,因为todo_list_todo_item_path没有删除方法的路径是&#34; show&#34;的路径。

另一种方法是使用Ajax请求。

如果它被正确删除:

您错过了控制器中的操作以及相应的正确控制器视图。仔细检查,因为他们已经嵌套了资源,您可能会将节目视图放在错误的位置。

答案 2 :(得分:0)

您的application.js文件似乎未加载。

<%= link_to 'Delete', todo_list_todo_item_path(@todo_list, todo_item.id), method: :delete, data: { confirm: "Are you sure?" } %>删除记录的正确方法(如果路线正确)

您确定已加载application.js吗?

jquery_ujs将method: :delete挂钩,将您的链接转换为将发送http DELETE的ajax链接。 因此,如果未正确加载application.js,您的链接就会像http GET链接一样显示操作。