【问题标题】:Destroy path not working in Ruby on Rails破坏路径在 Ruby on Rails 中不起作用
【发布时间】:2013-09-14 09:54:58
【问题描述】:

对此完全感到困惑,因为我相信它使用了正确的安静设置,但我似乎无法删除我的列表。

我有以下几点:

控制器:

def destroy
    @list = List.find(params[:id])
    @list.destroy
    redirect_to lists_path
end 

#37 def show
#38     @list = List.find(params[:id])
#39 end

Index.html.haml

- @list.each do |list| 
    ...
    = link_to "Delete", list_path(list), method: :delete, data: { confirm: 'Are you certain you want to delete this?' }
    ...

路线:

ListApp::Application.routes.draw do
    devise_for :users
    resources :lists

这给出了正确的 rake 路由输出:

           lists GET    /lists(.:format)               lists#index                                                                                                                                                                     
                 POST   /lists(.:format)               lists#create                                                                                                                                                                    
        new_list GET    /lists/new(.:format)           lists#new                                                                                                                                                                       
       edit_list GET    /lists/:id/edit(.:format)      lists#edit                                                                                                                                                                      
            list GET    /lists/:id(.:format)           lists#show                                                                                                                                                                      
                 PATCH  /lists/:id(.:format)           lists#update                                                                                                                                                                    
                 PUT    /lists/:id(.:format)           lists#update                                                                                                                                                                    
                 DELETE /lists/:id(.:format)           lists#destroy

但是在生产环境中运行时仍然出现以下错误。

I, [2013-09-10T15:27:40.338022 #453]  INFO -- : Started GET "/lists/2" for 81.159.35.212 at 2013-09-10 15:27:40 +0000                                                                                                                          
I, [2013-09-10T15:27:40.340626 #453]  INFO -- : Processing by ListsController#show as HTML                                                                                                                                                     
I, [2013-09-10T15:27:40.340867 #453]  INFO -- :   Parameters: {"id"=>"2"}                                                                                                                                                                      
I, [2013-09-10T15:27:40.354092 #453]  INFO -- : Completed 500 Internal Server Error in 13ms                                                                                                                                                    
F, [2013-09-10T15:27:40.359807 #453] FATAL -- :                                                                                                                                                                                                
NameError (undefined local variable or method `list' for #<ListsController:0x000000050a7c38>):                                                                                                                                                 
  app/controllers/lists_controller.rb:38:in `show'  

如果有人知道这可能是什么原因,任何帮助将不胜感激:)

【问题讨论】:

  • 错误出现在show 操作中,根据错误文本 - app/controllers/lists_controller.rb:38:in `show' - 你能显示该代码吗?
  • 嗨,达克斯,感谢您的回复。我实际上没有任何列表的显示页面,只是索引。正是从索引页面调用此删除方法。还有其他想法吗? :)
  • 您能否向我们展示 ListsController 上第 38 行的代码,即发生错误的行?
  • 我在上面的控制器中添加了第 38 行。当真正应该调用删除时,尝试加载显示页面时出错。

标签: ruby-on-rails ruby-on-rails-3 production-environment


【解决方案1】:

更新答案。

您的link_to 声明看起来不错:

= link_to "Delete", list_path(list), method: :delete, data: { confirm: 'Are you certain you want to delete this?' }

您的布局文件中可能没有包含必要的 javascript:

# app/views/layouts/application.html.haml
%head
  = javascript_include_tag "application"
  = csrf_meta_tag %>

这就是为什么list_path 无法执行destroy 操作并尝试执行show 操作的原因。

如果这不起作用,那么问题出在其他地方,阻止了 javascript 被执行。

【讨论】:

  • 我认为你的意思是反过来 - list_path 不是 lists_path
  • 您好 Vinodadhikary,感谢您的回复。列表路径只是加载 URL http://third-box-27032.euw1.actionbox.io:3000/lists.2,但没有调用删除方法或确认数据。 List_path 在开发中运行良好,它只是在生产中失败了?还有其他想法吗?
  • @TomPinchen,你可以试试:= link_to "Delete", list_path(list), method: :delete, remote: true, data: { confirm: 'Are you certain you want to delete this?' }
  • 遗憾的是这也不起作用,我收到一个错误ActionView::MissingTemplate (Missing template lists/show, application/show,这表明它根本没有找到删除方法:(
  • 感谢您的回复。我有正确的 javascript_include_tag 和 csrf_meta_tag 包含位添加 "data-turbolinks-track" =&gt; true 我想知道这是否是导致问题的原因。尽管在公共/资产中并且有一个工作清单 MD5 文件,但似乎也没有找到我的预编译资产。我会继续努力。再次感谢您的帮助!
【解决方案2】:

查看您的日志输出,该链接发送的是 GET 请求而不是 DELETE 请求。在 Rails 中,method: :delete 的链接通过 JavaScript 从 GET 请求更改为 DELETE 请求。

我的预感是,您没有在 application.js 中或通过 = javascript_include_tag :defaults 包含 Rails 默认 jquery javascript 文件,这将为您提供适用于 Rails 的 jquery 和 jquery.ujs。

您能否通过删除链接验证 jquery 和 jquery.ujs 是否已加载到您的页面上?

或者,尝试将= javascript_include_tag :defaults 添加到您的视图/布局中,看看链接是否开始工作。

另外,我建议您观看并关注this Railscasts on Unobtrusive Javascript 以获取更多信息。

【讨论】:

  • 感谢您的回复。我认为你是对的,它没有正确加载 Javascript,但这似乎很奇怪,因为一切都在 application.html.erb 中正常设置并且应该可以工作。即使将 Javascript 默认标记添加到实际的索引页面也不起作用。 :S
  • 您是否在浏览器中使用了网络检查器?单击链接时是否看到任何 JS 错误?尝试在 Web 检查器中打开控制台历史记录,以便在单击链接后查看任何错误:developers.google.com/chrome-developer-tools/docs/…
  • 这是一个测试:在您的生产页面上使用删除链接跳转到您的 JS 控制台。输入此命令$.rails == undefined。如果控制台返回true,那么您没有将 rails/jquery_ujs 加载到您的资产中。 $.rails 是 Rails 请求的 jquery_ujs 处理程序。所以,如果生产没有 jquery_ujs,那么你就有了资产管道问题。您能否发布完整的 %head 和 application.js?
【解决方案3】:

尝试链接到 lists_path 而不是 list_path。看看你的路线。

【讨论】:

    【解决方案4】:

    在您的控制器中,将“销毁方法”中的 @list.destroy 更改为 @list.delete 。过去它对我有用。希望对您有所帮助。

    【讨论】:

    • 虽然不是一个好习惯。如果您有与@list 关联的其他模型,这将引发错误,因为 delete 尝试直接删除相关记录。如果您在列表模型中的 has_many 关联前面添加 `dependent: :destroy',destroy 也会调用它的关联(has_many)销毁,它们的销毁方法将在您关注的销毁之前调用,即级联效应。
    【解决方案5】:

    我知道这个问题很老了,但是如果一些初学者正在为删除按钮不起作用而苦苦挣扎。 尝试代替link_to 使用button_to 它为我修复了它

    【讨论】:

    • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-06
    • 2013-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-28
    相关资源
    最近更新 更多