2016-12-01 3 views
0

Я правильно определил параметры в своем контроллере. Он также говорит No route matches {:action=>"edit", :controller=>"stories", :id=>nil} missing required keys: [:id]'.ActiveRecord :: RecordNotFound in StoriesController # edit

Однако я не определил его, чтобы найти «id» в методе редактирования ниже в моем контроллере? Кроме того, я не понимаю, почему мой уничтожить метод не работает, либо:/

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 

грабли маршруты:

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 

ответ

2

На ваш взгляд

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

Должно быть,

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

Потому что, ваш loop есть

Вы должны быть с переменной историю внутри цикла, потому что вы взяли | история | внутри параметров как | 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 %> 

Теперь удаления ссылка должна быть такой,

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

Спасибо. Почему это история, а не @story? – Benjamints

+0

В вашем цикле for вы зацикливаете 'story' локальную переменную, а не' @ story' – Sravan

+0

проверьте ответ сейчас, у него есть некоторые объяснения – Sravan

Смежные вопросы