Ruby on rails ActionController::使用自定义路由减少参数
我正在构建一个数字图书馆,目前我正在尝试将soft_delete添加到一个应用程序中,但我遇到了显示错误的问题 ActionController::BooksController中的参数缺失#更新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
缺少参数或值为空: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 }