2016-11-30 4 views
0

В нем написано undefined method stories_path'`.NoMethodError in Story # new

Привет, Я пытался найти решение вышеупомянутой ошибки на некоторое время, но безрезультатно. Я также получаю ошибку в моем терминале, а также:

ActionView::Template::Error (undefined method `stories_path' for #<#<Class:0x005557c1a40560>:0x005557c1885cc0> 
Did you mean? story_path): 
    1: <%= form_for @story do |f| %> 
    2: <%= render 'shared/errors', object: @story %> 
    3: 
    4: <div class="form-group"> 

У меня есть чувство, что это может быть связано с моими маршрутами, но я не уверен в том, как изменить конфигурацию.

Мой контроллер:

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


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

def new 
    @story = Story.new 
end 

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

def edit 
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(:title, :body) 
end 

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


end 

new.html.erb:

<%= form_for @story do |f| %> 

<%= render 'shared/errors', object: @story %> 

    <div class="form-group"> 
    <%= f.label :title %> 
    <%= f.text_field :title, class: 'form-control', required: true %> 
    </div> 

    <div class="form-group"> 
    <%= f.label :body %> 
    <%= f.text_area :body, class: 'form-control', required: true, cols: 3 %> 
    </div> 

    <%= f.submit 'Post', class: 'btn btn-primary' %> 
<% end %> 

Мой routes.rb файл:

Rails.application.routes.draw сделать

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

и, наконец,/shared/_err ors.html.erb

<% if object.errors.any? %> 
    <div class="panel panel-danger"> 
    <div class="panel-heading"> 
     <h3 class="panel-title">The following errors were found while submitting the form:</h3> 
    </div> 

    <div class="panel-body"> 
     <ul> 
     <% object.errors.full_messages.each do |msg| %> 
      <li><%= msg %></li> 
     <% end %> 
     </ul> 
    </div> 
    </div> 
<% end %> 

Добавлена ​​информация: rake routes | grep stories не работает. Однако rake routes | grep story дисплей эти результаты:

story_index GET /story(.:format)    story#index 
         POST /story(.:format)    story#create 
       new_story GET /story/new(.:format)   story#new 
       edit_story GET /story/:id/edit(.:format)  story#edit 
        story GET /story/:id(.:format)   story#show 
         PATCH /story/:id(.:format)   story#update 
         PUT /story/:id(.:format)   story#update 
         DELETE /story/:id(.:format)   story#destroy 
        root GET /       story#index 
+0

вы можете также разместить вывод 'рек маршрутов | grep stories' –

+0

Еще один совет - ваше имя контроллера должно быть 'StoriesController' –

+0

О, действительно? Я добавил дополнительную информацию выше. Я думаю, что это раскрывает несчастную реальность здесь! Что я сделал не так? – Benjamints

ответ

2

Самый простой, это следовать «конвенции по конфигурации» и используйте настройки по умолчанию, что Rails ожидает.

Так что в вашем routes.rb

resources :stories 
root to: 'stories#index' 

переименовывать app/controllers/story_controller.rb в app/controllers/stories_controller.rb и изменить определение класса для

class StoriesController < ApplicationController 

В остальном все должно работать.

+0

Спасибо всем! Я ценю быстрые ответы. Мне трудно понять, когда я намерен плюрализовать! – Benjamints

+0

Модели являются сингулярными, например. 'class Story SteveTurczyn

2

Основная проблема здесь вы используете сингулярного имя контроллера и маршруты

Вы должны изменить следующие

routes.rb

resources :stories 

stories_controller.rb

class StoriesController < ApplicationController 
end 

, который даст вам следующие маршруты

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 

И тогда форма будет получить stories_path должным образом, создавая новую историю

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