找不到'id'=的消息

时间:2015-06-12 08:12:21

标签: ruby-on-rails

当我在索引操作中在messages.rb中定义@message时,错误会跳转:在转到/ messages时找不到带有'id'=的消息。但是我也在destroy动作中定义了@message,它永远不会导致这个错误。

应用程序/控制器/ messages.rb

  class MessagesController < ApplicationController
before_action :authenticate_user!

def new
    @message = current_user.messages.build
end

def create
    @message = current_user.messages.build(message_params)
    if @message.save
        redirect_to messages_path
    else
        render '/messages/new'
    end
end

def edit
end

def update
end

def destroy
    @message = Message.find(params[:id])
    @message.destroy
    redirect_to '/messages'
end

def index
    @messages = Message.order(id: :desc).paginate(page: params[:page])
    @message = Message.find(params[:id])
end

protected

def setup
end

def message_params
    params.require(:message).permit(:content)
end

日志中的错误:

  

在2015-06-12 15:57:59 +0800开始为:: 1开始获取“/ messages”   由MessagesController处理#index为HTML     用户负载(0.2ms)SELECT“users”。* FROM“users”WHERE“users”。“id”=? ORDER BY“users”。“id”ASC LIMIT 1 [[“id”,4]]     消息加载(0.2ms)SELECT“messages”。* FROM“messages”WHERE“messages”。“id”=? LIMIT 1 [[“id”,nil]]   已完成404未在20ms内找到(ActiveRecord:1.3ms)   ActiveRecord :: RecordNotFound(无法找到带有'id'=的消息):     app / controllers / messages_controller.rb:31:在`index'

我不知道为什么会发生这种情况,是否与分页有任何关系?因为如果没有像 @vars = Var.paginate这样的实例变量(页面:params [:page ])在同一行动中定义。

2 个答案:

答案 0 :(得分:0)

问题是由于索引操作中的这一行。

@message = Message.find(params[:id])

销毁行动params[:id]后不再可用。此行不是必需的。如果你想使用它,你必须指定参数。

答案 1 :(得分:0)

只需从index操作中删除此行:

@message = Message.find(params [:id])

它不起作用,因为id中没有params参数。在它出现的destroy动作中,因为它是通过路径传递的。为了澄清,比较2个方案:

Get /messages
Delete /messages/2

在第二路线2中表示消息的id。第一个是缺席。

<强>更新

您的评论中的问题:

<% @messages.each do |message| %>
  <div id="message-<%= message.id %>">
<% end %>