Ruby on rails ActiveRecord::RecordNotFound在MessagesControllerdestroy中

Ruby on rails ActiveRecord::RecordNotFound在MessagesControllerdestroy中,ruby-on-rails,Ruby On Rails,我是RoR的初学者,我正在尝试添加一个复选框功能选择多个数据记录复选框并将其删除到我的应用程序中的表中。当我选中一个复选框并单击删除按钮时,我得到了一个错误,如标题中所述 这是我的控制器文件: def destroy @message = Message.find(params[:id]) @message.destroy respond_to do |format| format.html { redirect_to messages_url, notice: 'Messa

我是RoR的初学者,我正在尝试添加一个复选框功能选择多个数据记录复选框并将其删除到我的应用程序中的表中。当我选中一个复选框并单击删除按钮时,我得到了一个错误,如标题中所述

这是我的控制器文件:

def destroy
  @message = Message.find(params[:id])
  @message.destroy
  respond_to do |format|
    format.html { redirect_to messages_url, notice: 'Message was successfully destroyed.' }
    format.json { head :no_content }
  end
end

private

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

# Never trust parameters from the scary internet, only allow the white list through.
def message_params
  params.require(:message).permit(:content)
end
这是我的index.html文件:

<h1>Messages</h1>
<%= form_tag messages_path, method: :delete do %>
<table>
  <thead>
    <tr>
      <th>Content</th>
      <th colspan="3"></th>
    </tr>
  </thead>
  <tbody>

    <% @messages.each do |message| %>
      <tr>
        <td><%= check_box_tag "message_ids[]", message.id%></td>
        <td><%= message.content %></td>
        <td><%= link_to 'Show', message %></td>
        <td><%= link_to 'Edit', edit_message_path(message) %></td>
        <!-- <td><%= link_to 'Destroy', message, method: :delete, data: { confirm: 'Are you sure?' } %></td> -->
      </tr>
    <% end %> 
  </tbody>
</table>
<br>
<%= button_to "Delete", message_path(@messages),method: :delete%>
</br>
<% end %>
<br>
<%= link_to  'New Message', new_message_path %> 
</br>
错误显示:

找不到具有“id”的邮件=

第69行附近的提取源:67 68 69 70 71 72

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

# Never trust parameters from the scary internet, only allow the white list through.
请帮我找出我的错误


看起来您正在尝试选择具有ID数组的模型。您可能需要执行类似Message.where:id=>params[:ids].destroy_all这样的操作。其中params[:ids]=[1,2,3等]。

问题在于删除按钮,它应该是这样的

<h1>Messages</h1>
<%= form_tag messages_path, method: :delete do %>
<table>
  <thead>
    <tr>
      <th>Content</th>
      <th colspan="3"></th>
    </tr>
  </thead>
  <tbody>

    <% @messages.each do |message| %>
      <tr>
        <td><%= check_box_tag "message_ids[]", message.id%></td>
        <td><%= message.content %></td>
        <td><%= link_to 'Show', message %></td>
        <td><%= link_to 'Edit', edit_message_path(message) %></td>
        <!-- <td><%= link_to 'Destroy', message, method: :delete, data: { confirm: 'Are you sure?' } %></td> -->
      </tr>
    <% end %> 
  </tbody>
</table>
<br>
<%#= button_to "Delete", message_path(@messages),method: :delete%>
<%= submit_tag :Delete,class: 'btn' %>

</br>
<% end %>
<br>
<%= link_to  'New Message', new_message_path %> 
</br>
注意:-如果您正在使用用于销毁方法的操作前回调,则不要使用用于销毁方法的操作前回调

before_action :set_message, only: [:show, :edit, :update]

你可以把它分为两种方法

在控制器中创建多个

def destroy_multiple
  @messages = Message.where(id: params[:message_ids])
  @messages.destroy_all
  respond_to do |format|
    format.html { redirect_to messages_url, notice: 'Message was successfully destroyed.' }
    format.json { head :no_content }
  end
end
修改你的路线.rb

Rails.application.routes.draw do
  resources :messages do
    collection { delete :destroy_multiple }    
  end
  root to: "messages#index"
  # For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html
end
你的html文件

<%= form_tag destroy_multiple_messages_path, method: :delete do %>
<table>
  <thead>
    <tr>
      <th>Content</th>
      <th colspan="3"></th>
    </tr>
  </thead>
  <tbody>

    <% @messages.each do |message| %>
      <tr>
        <td><%= check_box_tag "message_ids[]", message.id%></td>
        <td><%= message.content %></td>
        <td><%= link_to 'Show', message %></td>
        <td><%= link_to 'Edit', edit_message_path(message) %></td>
        <td><%= link_to 'Destroy', message, method: :delete, data: { confirm: 'Are you sure?' } %></td>
      </tr>
    <% end %> 
  </tbody>
</table>
<br>
<%= button_to "Delete", message_path(@messages), method: :delete%>
</br>
<% end %>
<br>
<%= link_to  'New Message', new_message_path %> 
</br>

最后,您有两个删除功能。我希望这对您有所帮助。

您能确认id是否正确传递吗?你的参数包含什么?在这个链接上传递特定id不是所有id所以删除特定记录。@ChaudharyPrakash我在这个删除链接上传递特定id,当我运行服务器时,它在消息中显示NoMethodError SINDEX即使我更改了代码,因为你说我得到了相同的错误,错误已在我的控制器的私有类下显示set_message方法。@Priya我理解你的困惑,你注意到我答案的最后一行注释了吗,正如我所悲伤的,你是在控制器顶部使用回调,比如在\u操作之前还是在\u过滤器之前?谢谢@Gabbar,但在我从\u操作之前删除destroy方法后,我在messages controllerdestroy未定义的@Priya方法'destroy\u all'中得到了一个错误名称。好的,让我们只使用destroy而不是destroy\u,希望这应该是正确的工作:抱歉,在你说之前我试过了,但我在MessagesControllerdestroy未定义的方法'destroy'中遇到了相同的错误**NoMethodError**
Rails.application.routes.draw do
  resources :messages do
    collection { delete :destroy_multiple }    
  end
  root to: "messages#index"
  # For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html
end
<%= form_tag destroy_multiple_messages_path, method: :delete do %>
<table>
  <thead>
    <tr>
      <th>Content</th>
      <th colspan="3"></th>
    </tr>
  </thead>
  <tbody>

    <% @messages.each do |message| %>
      <tr>
        <td><%= check_box_tag "message_ids[]", message.id%></td>
        <td><%= message.content %></td>
        <td><%= link_to 'Show', message %></td>
        <td><%= link_to 'Edit', edit_message_path(message) %></td>
        <td><%= link_to 'Destroy', message, method: :delete, data: { confirm: 'Are you sure?' } %></td>
      </tr>
    <% end %> 
  </tbody>
</table>
<br>
<%= button_to "Delete", message_path(@messages), method: :delete%>
</br>
<% end %>
<br>
<%= link_to  'New Message', new_message_path %> 
</br>
def destroy
  @message = Message.find(params[:id])
  @messages.destroy
  @messages.destroy_all
  respond_to do |format|
    format.html { redirect_to messages_url, notice: 'Message was successfully destroyed.' }
    format.json { head :no_content }
  end
end