Reputation: 160
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
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
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