【问题标题】:Unable to delete all records in Rails 4 through link_to无法通过 link_to 删除 Rails 4 中的所有记录
【发布时间】:2014-01-31 20:32:20
【问题描述】:

我最初收到Routing Errors on attempts to delete all records in a table using Rails 4 through a link_to 中发布的路由错误,该问题已得到解决。

现在我遇到了传递“id=remove_all”的问题。我正在使用 Rails 4,并尝试使用 link_to 助手删除所有评估。相关代码如下:

routes.rb

   resources :assessments do
     collection do
       delete :remove_all
     end
   end

评估 index.html.erb

 <p>To delete all assessments in one swoop, click <%= link_to 'Remove ALL Assessments', remove_all_assessments_path, method: :destroy, data: { confirm: 'Are you sure?' } %>

assesments_controller.rb

  def remove_all
    @assessments = Assessment.all
    @assessments.each do |assessment|
        assessment.destroy(assessment.id)
     end
    flash[:notice] = "All assessments have been deleted."
    redirect_to assessments_url
  end

我运行 rake 路线和

Prefix                 Verb   URI Pattern                       Controller#Action
remove_all_assessments DELETE /assessments/remove_all(.:format) assessments#remove_all

为链接生成的 HTML 源代码:

<p>To delete all assessments in one swoop, click <a data-confirm="Are you sure?" data-method="destroy" href="/assessments/remove_all" rel="nofollow">Remove ALL Assessments</a>

当我单击“删除所有评估”链接时,我希望在 AssessmentsController 中运行 remove_all 操作,并删除 @assessments 中的所有评估,然后将我重定向到评估 URL。但是,当我点击“删除所有评估”链接时,我被带到了网址:http://localhost:3000/assessments/remove_all

ActiveRecord::RecordNotFound in AssessmentsController#destroy
Couldn't find Assessment with id=remove_all

# Use callbacks to share common setup or constraints between actions.
def set_assessment
@assessment = Assessment.find(params[:id])
end

日志显示:

Started DELETE "/assessments/remove_all" for 127.0.0.1 at 2014-01-31 15:41:41 -0500
Processing by AssessmentsController#destroy as HTML
 Parameters: {"authenticity_token"=>"fooBarBaz=", "id"=>"remove_all"}

如何使用 Delete 动词将 @assessments 集合传递给 remove_all 操作?这可能吗?

【问题讨论】:

  • 您的路线中还有其他内容吗?
  • 您还应该在链接中使用method: :delete 而不是method: :destroy
  • 另外,您可以执行@assessments.destroy_all,而不是使用每个块迭代所有评估

标签: ruby-on-rails ruby-on-rails-4


【解决方案1】:

因为

resources :assessments

已经有路线可以摧毁 喜欢/assessment/:id with method :delete

所以您的 remove_all_assessments_path 将访问该 url,因为它首先出现在您的 routes.rb 文件中

要解决您的问题,您必须执行以下操作:-

resources :assessments, except: [:destroy] do
 collection do
   delete :remove_all
 end 
end

或在其上方定义您的 remove_all_assessments 网址。

喜欢

 match "/assessments/remove_all", to: "assessments#remove_all", via: [:delete], as: :remove_all_assessments
 resources :assessments do
 collection do
   delete :remove_all
 end 
end

【讨论】:

    猜你喜欢
    • 2012-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-04
    • 1970-01-01
    • 2018-01-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多