Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails ActionController::使用自定义路由减少参数_Ruby On Rails_Soft Delete - Fatal编程技术网

Ruby on rails ActionController::使用自定义路由减少参数

Ruby on rails ActionController::使用自定义路由减少参数,ruby-on-rails,soft-delete,Ruby On Rails,Soft Delete,我正在构建一个数字图书馆,目前我正在尝试将soft_delete添加到一个应用程序中,但我遇到了显示错误的问题 ActionController::BooksController中的参数缺失#更新 缺少参数或值为空:book soft_delete方法的作用是将其在数据库中的表从默认的false值更新为true。我已经检查了我的代码,但找不到问题的来源 图书型号 class Book < ApplicationRecord #add a model scope to fetch onl

我正在构建一个数字图书馆,目前我正在尝试将soft_delete添加到一个应用程序中,但我遇到了显示错误的问题

ActionController::BooksController中的参数缺失#更新
缺少参数或值为空:book

soft_delete方法的作用是将其在数据库中的表从默认的false值更新为true。我已经检查了我的代码,但找不到问题的来源

图书型号

class Book < ApplicationRecord
  #add a model scope to fetch only non-deleted records
  scope :not_deleted, -> { where(soft_deleted: false) }
  scope :deleted, -> { where(soft_deleted: true) }

  #create the soft delete method
  def soft_delete 
    update(soft_deleted: true)
    soft_deleted
  end

  # make an undelete method
  def undelete
    update(soft_deleted: false)
  end
end
路线

Rails.application.routes.draw do
  resources :books
  put '/books/:id' => 'books#soft_delete'
end
图书索引视图

<h1>Books</h1>
<tbody>
    <% @books.each do |book| %>
      <tr>
        <td><%= book.name %></td>
        <td><%= book.author %></td>
        <td><%= book.description %></td>
        <td><%= link_to 'Show', book %></td>
        <td><%= link_to 'Edit', edit_book_path(book) %></td>
        <td><%= link_to 'Destroy', book, method: :delete, data: { confirm: 'Are you sure?' } %></td>
        <td><%= link_to 'Soft Delete', book, method: :put, data: { confirm: 'Are you sure?' } %></td>
        soft_delete
      </tr>
    <% end %>
  </tbody>
书籍
软删除
Rails正在将
路由到
更新
操作,因为
资源:书籍
是在自定义路由之前定义的,Rails使用与请求匹配的第一个路由

在终端中运行
rails routes-g books
,您将看到如下内容:

books GET/books(:format)books#index
发布/书籍(:格式)书籍#创建
new#book GET/books/new(:format)books#new
编辑书籍获取/书籍/:id/编辑(:格式)书籍#编辑
图书获取/图书/:id(:格式)图书#显示
补丁/书籍/:id(:格式)书籍#更新
PUT/books/:id(:format)books#update
删除/books/:id(:format)图书#销毁
PUT/books/:id(:format)books#soft#u delete
如您所见,
books#update
books#soft#u delete
的路由是相同的

您可以通过创建一个命名路由来修复它:
put'/books/:id'=>“books#soft_delete”,例如:“soft_delete'

books GET/books(:format)books#index
发布/书籍(:格式)书籍#创建
new#book GET/books/new(:format)books#new
编辑书籍获取/书籍/:id/编辑(:格式)书籍#编辑
图书获取/图书/:id(:格式)图书#显示
补丁/书籍/:id(:格式)书籍#更新
PUT/books/:id(:format)books#update
删除/books/:id(:format)图书#销毁
soft#u delete PUT/books/:id(:format)books#soft#u delete

然后,修改模板以使用新的帮助程序:

我建议您不要使用像这样的显式路由
put'/books/:id'=>“books”#soft_delete'
Rails具有“成员路由”,因此您可以通过以下方式重写路由:

resources :books, only: %i[index destroy] do
  member { put :soft_delete }
end
这里我使用了选项“only”,它允许您只定义必要的路由(不是全部7条,而是2条-索引和销毁)

首先:您已经定义了
资源:书籍
。此定义为您创建7条路线:

    books GET    /books(.:format)           -> books#index
          POST   /books(.:format)           -> books#create
 new_book GET    /books/new(.:format)       -> books#new
edit_book GET    /books/:id/edit(.:format)  -> books#edit
     book GET    /books/:id(.:format)       -> books#show
          PATCH  /books/:id(.:format)       -> books#update (this and next route are the same, and considering as 1, so we have 7 routes, not 8)
          PUT    /books/:id(.:format)       -> books#update
          DELETE /books/:id(.:format)       -> books#destroy
因此,带有方法PUT和路径“/books/:id”的路由已经存在,并且您的
PUT“/books/:id”=>“books\soft\u delete”
将永远不会被使用。这就是触发错误的原因:“ActionController::ParameterMissing in BooksController#update”-您的链接单击已触发BooksController#update操作调用,该调用需要参数中的book键

第二: 我建议您删除方法:soft_delete和:undelete from model。Rails提供方法:切换!用于即时写入数据库和:切换以更改值,而不是立即保存更改。因此,您可以在控制器中编写以下代码:

book = Book.find_by(id: params[:id])
book.toggle!(:soft_deleted)
请注意,列soft_deleted应该是布尔值,以使其正常工作

您的链接应为:

link_to 'Soft Delete', soft_delete_book_path(book), data: { method: :put }

问题在于您用来发送此邮件的表单。更新方法中的此行
@book.soft_delete(book_params)
表示您正在使用
book_params
,这需要
book
。参数应该类似于“
:book=>{title:'title here',…}}
。如果查看正在发送的参数,它将丢失包含正在发送的属性的外部
book
对象。你能告诉我被派去的人是什么样子的吗?非常感谢。这个解决方案很有魅力。你帮我省了几个小时的压力。再次感谢你。请允许我,我能了解更多关于你是如何学好ruby的吗?我很想成为一名更好的Ruby开发人员。当然)首先,你可以在这里找到很多关于rails的有用信息。学习ruby方法-,非常感谢。请问,当我面临代码问题时,我能否以任何其他方式或任何其他平台与您联系以寻求帮助?您的解决方案似乎非常简单明了。我很乐意提供帮助,因此您可以在FaceBook上提供您的姓名谢谢您的解决方案。虽然我试过了,但面对同样的参数问题,我不得不使用问题的第一个解决方案。
book = Book.find_by(id: params[:id])
book.toggle!(:soft_deleted)
link_to 'Soft Delete', soft_delete_book_path(book), data: { method: :put }