【问题标题】:undefined method _path (NoMethodError)未定义的方法 _path (NoMethodError)
【发布时间】:2013-03-08 18:35:46
【问题描述】:

当我尝试访问包含创建帖子的表单的页面时,我在 Rails 应用程序中收到以下错误。我正在尝试在他的示例应用中实现类似于 Michael Hartl 的 Micropost 功能的功能:

NoMethodError in Home#index
undefined method `posts_path' for #<#<Class:0xb5c70744>:0xb60013b8>

这是包含插入表单的代码的索引视图页面:

<%= render 'shared/post_form' if user_signed_in? %>

_post_form.html.erb:

<%= form_for(@post) do |f| %>
  <%= render 'shared/error_messages', object: f.object %>
  <div class="field">
    <%= f.text_area :content, placeholder: "Provide your network with a status update..." %>
  </div>
  <%= f.submit "Post", class: "btn btn-large btn-primary" %>
<% end %>

这里是 Home 控制器:

    class HomeController < ApplicationController

    before_filter :authenticate_user!

  def index
    #render :text => "Welcome #{current_user.email}!"
    @users = User.all
    @post = current_user.posts.build if signed_in?
  end
end

我真的可以在审查代码时使用一些帮助。我正盯着它看,我需要其他人为我审查它。我是 Rails 新手,如果我没有提供必要的信息,请原谅我。

附加信息:我正在使用 Devise gem 来处理用户身份验证。

谢谢!

编辑:我添加了错误的控制器。

编辑2:

Routes.rb 文件:

AppName::Application.routes.draw do

  #get "users/index"

  #get "users/show"



authenticated :user do
    root :to => 'home#index'
  end
  root :to => "home#index"
  devise_for :users
  resources :users do
    member do
      get :following, :followers, :posts
    end
  end
  resources :works
  resources :relationships, only: [:create, :destroy]
end

编辑 3:耙路线

root        /                              home#index
                    root        /                              home#index
        new_user_session GET    /users/sign_in(.:format)       devise/sessions#new
            user_session POST   /users/sign_in(.:format)       devise/sessions#create
    destroy_user_session DELETE /users/sign_out(.:format)      devise/sessions#destroy
           user_password POST   /users/password(.:format)      devise/passwords#create
       new_user_password GET    /users/password/new(.:format)  devise/passwords#new
      edit_user_password GET    /users/password/edit(.:format) devise/passwords#edit
                         PUT    /users/password(.:format)      devise/passwords#update
cancel_user_registration GET    /users/cancel(.:format)        devise/registrations#cancel
       user_registration POST   /users(.:format)               devise/registrations#create
   new_user_registration GET    /users/sign_up(.:format)       devise/registrations#new
  edit_user_registration GET    /users/edit(.:format)          devise/registrations#edit
                         PUT    /users(.:format)               devise/registrations#update
                         DELETE /users(.:format)               devise/registrations#destroy
          following_user GET    /users/:id/following(.:format) users#following
          followers_user GET    /users/:id/followers(.:format) users#followers
              posts_user GET    /users/:id/posts(.:format)     users#posts
                   users GET    /users(.:format)               users#index
                         POST   /users(.:format)               users#create
                new_user GET    /users/new(.:format)           users#new
               edit_user GET    /users/:id/edit(.:format)      users#edit
                    user GET    /users/:id(.:format)           users#show
                         PUT    /users/:id(.:format)           users#update
                         DELETE /users/:id(.:format)           users#destroy
                   works GET    /works(.:format)               works#index
                         POST   /works(.:format)               works#create
                new_work GET    /works/new(.:format)           works#new
               edit_work GET    /works/:id/edit(.:format)      works#edit
                    work GET    /works/:id(.:format)           works#show
                         PUT    /works/:id(.:format)           works#update
                         DELETE /works/:id(.:format)           works#destroy
           relationships POST   /relationships(.:format)       relationships#create
            relationship DELETE /relationships/:id(.:format)   relationships#destroy

【问题讨论】:

  • &lt;%= form_for(@post) do |f| %&gt; 更改为&lt;%= form_for(Post.new) do |f| %&gt;
  • 最后一条评论没有解决根本问题。它不是完全连接 Rails 使用 REST HTTP,而是为该表单创建一个 Post 对象。当您使用此表单编辑存储在 @post 中的已创建对象时,这会成为一个问题。要找到问题的根源,您可以发布您的 routes.rb 文件吗?
  • 抱歉,&lt;%= form_for Post.new ,:url =&gt; {:action =&gt; :create, :controller =&gt; :posts} do |f| %&gt; 这应该可以。
  • 感谢大家的帮助。我添加了正确的 Home 控制器代码,还添加了 routes.rb 代码
  • 如果您有验证用户的前置过滤器,则不需要 if 已登录

标签: ruby-on-rails


【解决方案1】:

您需要在您的routes.rb 文件中添加resources :posts,以便Rails 自动为您创建posts_path 帮助程序。

添加resources :posts 将生成正确的RESTful 路由供您创建、删除、更新和获取posts。查看 Ruby on Rails 路由指南,特别是 this section here 路由和 RESTful 路由。

【讨论】:

  • 您好,Zajn,非常感谢您的回复。这行得通。我没有考虑添加资源 :posts,因为 Michael Hartl 的教程似乎忽略了它(我不明白为什么)。无论如何,我应该尝试一下!非常感谢您的帮助以及其他所有回复的人!
猜你喜欢
  • 1970-01-01
  • 2018-07-06
  • 2013-04-24
  • 2015-05-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-01
  • 2019-06-12
相关资源
最近更新 更多