ActiveRecord::RecordNotFound 在 StoriesController 中#edit

ActiveRecord::RecordNotFound in StoriesController#edit

我已经在我的控制器中正确定义了参数。它还说 No route matches {:action=>"edit", :controller=>"stories", :id=>nil} missing required keys: [:id]'

但是我不是定义它来在我的控制器下面的编辑方法中找到'id'吗?另外,我不明白为什么我的 destroy 方法也不起作用:/

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 路线:

  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

在您看来,

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

应该是,

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

因为,你的loop是,

你应该在循环中有 story 变量,因为你已经采取了 |story|参数内部为 |story|

所以,你的表格将是。

<% @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 %>

现在删除link应该是这样的,

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