killernova
killernova

Reputation: 160

Couldn't find Message with 'id'=

When I define @message in messages.rb at index action, the error jumps: Couldn't find Message with 'id'= while go to /messages. But I also defined @message at destroy action and it never leads to this error.

app/controllers/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

end

errors in logs:

Started GET "/messages" for ::1 at 2015-06-12 15:57:59 +0800 Processing by MessagesController#index as HTML User Load (0.2ms) SELECT "users".* FROM "users" WHERE "users"."id" = ? ORDER BY "users"."id" ASC LIMIT 1 [["id", 4]] Message Load (0.2ms) SELECT "messages".* FROM "messages" WHERE "messages"."id" = ? LIMIT 1 [["id", nil]] Completed 404 Not Found in 20ms (ActiveRecord: 1.3ms) ActiveRecord::RecordNotFound (Couldn't find Message with 'id'=): app/controllers/messages_controller.rb:31:in `index'

I don't know why it happens, does it have any relationship with paginate? cause I find other instance variables can defined with @var = Var.find(params[:id]) if no instance variables like @vars = Var.paginate(page: params[:page]) defined in the same action.

Upvotes: 0

Views: 1330

Answers (2)

hedgesky
hedgesky

Reputation: 3311

Just remove this line from your index action:

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

It doesn't work, because there isn't id parameter in params. In destroy action it present because it is passed via routes. For clarification, compare 2 pathes:

Get /messages
Delete /messages/2

In second route 2 represents id of a message. In first one it is absent.

Update

For your question in comment:

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

Upvotes: 0

sansarp
sansarp

Reputation: 1466

The problem is due to this line in your index action.

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

After destroy action params[:id] is no longer available. This line is not required. If you want to use it you have to specify the params.

Upvotes: 0

Related Questions