Benjamints Benjamints - 2 days ago 4
Ruby Question

ActiveRecord::RecordNotFound in StoriesController#edit

I have correctly defined the params in my controller. It also says

No route matches {:action=>"edit", :controller=>"stories", :id=>nil} missing required keys: [:id]'
.

However didn't I define it to find the 'id' in the edit method below in my controller? Also, I don't understand why my destroy method isn't working either :/

class StoriesController < ApplicationController
before_action only: [:destroy, :show, :edit, :update]


def index
@stories = Story.order('created_at DESC')
end

def new
@story = current_user.stories.build
end

def create
@story = current_user.stories.build(story_params)
if @story.save
flash[:success] = "Your beautiful story has been added!"
redirect_to root_path
else
render 'new'
end
end

def edit
@story = Story.find(params[:id])
end

def update
if @story.update.attributes(story_params)
flash[:success] = "More knowledge, more wisdom"
redirect_to root_path
else
render 'edit'
end
end

def destroy
if @story.destroy
flash[:success] = "I think you should have more confidence in your storytelling"
else
flash[:error] = "Can't delete this story, sorry"
end
end

def show
@stories = Story.all
end

private

def story_params
params.require(:story).permit(:name, :description)
end



end


Index.html.erb:

<p id="notice"><%= notice %></p>


<h1>This is a list of posts</h1>

<table>
<thead>
<tr>
<th>Name</th>
<th>Description</th>
<th>User</th>
<th colspan="3"></th>
</tr>
</thead>

<tbody>
<% @stories.each do |story| %>
<tr>
<td><%= story.name %></td>
<td><%= story.description %></td>
<td><%= story.user.email %></td>
<td><%= link_to 'Show', story %></td>
<% if user_signed_in? %>
<td><%= link_to 'Edit', edit_story_path(@story) %></td>
<td><%= link_to 'Destroy', story, method: :delete, data: { confirm: 'Are you sure?'} %></td>
<% end %>
</tr>
<% end %>

</tbody>
</table>

<%= link_to 'New Story', new_story_path %>


Routes.rb:

Rails.application.routes.draw do

resources :stories
devise_for :users
root to: 'stories#index'
end


rake routes:

Prefix Verb URI Pattern Controller#Action
stories GET /stories(.:format) stories#index
POST /stories(.:format) stories#create
new_story GET /stories/new(.:format) stories#new
edit_story GET /stories/:id/edit(.:format) stories#edit
story GET /stories/:id(.:format) stories#show
PATCH /stories/:id(.:format) stories#update
PUT /stories/:id(.:format) stories#update
DELETE /stories/:id(.:format) stories#destroy

Answer

In your view,

<td><%= link_to 'Edit', edit_story_path(@story) %></td>

Should be,

<td><%= link_to 'Edit', edit_story_path(story) %></td>

Because, your loop is,

You should be having story variable inside loop because you have taken |story| inside the parameters as |story|

So, you form will be.

<% @stories.each do |story| %>
      <tr>
            <td><%= story.name %></td>
            <td><%= story.description %></td>
            <td><%= story.user.email %></td>
            <td><%= link_to 'Show', story %></td>
            <% if user_signed_in? %>
                  <td><%= link_to 'Edit', edit_story_path(@story) %></td>
                  <td><%= link_to 'Destroy', story_path(story),method: :delete,data: { confirm: 'Are you sure?' } %></td>
            <% end %>
      </tr>
<% end %>

Now, the delete link should be like this,

<td><%= link_to 'Destroy', story_path(story),method: :delete,data: { confirm: 'Are you sure?' } %></td>
Comments