未定义的方法`posts_path&#39; for#&lt;#<class:0x007fe3547d97d8>:0x007fe3546d58f0&gt;

时间:2016-10-06 21:01:11

标签: ruby-on-rails ruby

我是rails的新手,我收到了这个错误:

SELECT p.name 
FROM PARENTS p 
JOIN Parents_Kids pk ON pk.ParentID=p.ParentID 
JOIN Kids k ON k.KidID=pk.KidID 
group by p.name
having count(case when k.name like '%mike%' then 1 end) = 0

我已经在下面发布了我的文件,请记住我对rails很新,所以我们非常感谢您的简单解释!

Route.rb:

undefined method `posts_path' for #<#<Class:0x007fe3547d97d8>:0x007fe3546d58f0>

post_controller.rb:

Rails.application.routes.draw do
  get '/post' => 'post#index'
  get '/post/new' => 'post#new'
  post 'post' => 'post#create'
end

new.html.erb:

class PostController < ApplicationController
    def index
        @post = Post.all
    end

    def new
      @post = Post.new
    end

    def create
      @post = Post.new(post_params)
      if @post.save
        redirect_to '/post'
      else
        render 'new'
      end
    end

    private
    def post_params
      params.require(:post).permit(:content).permit(:title)
    end
end

4 个答案:

答案 0 :(得分:5)

我猜form_for(@post)期望有一个名为posts_path的方法,其中一个方法不存在,因为它尚未在您的路径文件中定义。尝试更换:

Rails.application.routes.draw do
  get '/post' => 'post#index'
  get '/post/new' => 'post#new'
  post 'post' => 'post#create'
end

Rails.application.routes.draw do
  resources :posts, only: [:new, :create, :index]
end

编辑:更多信息:

阅读http://guides.rubyonrails.org/form_helpers.html表单助手的完整页面,特别是阅读“2.2将表单绑定到对象”部分以及部分说明:

  

在处理RESTful资源时,可以获得对form_for的调用   如果您依赖记录识别,则会更加容易。简而言之,   你可以传递模型实例并让Rails找出模型   姓名和其他人:

## Creating a new article
# long-style:
form_for(@article, url: articles_path)
# same thing, short-style (record identification gets used):
form_for(@article)

## Editing an existing article
# long-style:
form_for(@article, url: article_path(@article), html: {method: "patch"})
# short-style:
form_for(@article)
     

注意短格式form_for调用是如何方便的   同样,无论记录是新的还是现有的。记录   识别是足够聪明的,以确定记录是否是新的   问record.new_record?它还会选择要提交的正确路径   to和基于对象类的名称。

所以,无论有意还是无意,当你说form_for(@post)时,你会根据你的@post变量的名称来猜测应该提交表单的路线。您定义的路线与预期的路线不匹配。

有关路由路由的更多信息,请阅读http://guides.rubyonrails.org/routing.html处的整个页面,并特别注意“2资源路由:Rails默认值”部分。您的form_for(@post)将假设您正在使用“资源路由”,这是我切换到的。

至于为什么会出现新错误?您的应用程序中的其他位置您希望使用以前的自定义路径,现在您正在使用rails“资源路径”,因此您的路径名称将不同。没有路线匹配[GET]“/ post / new”因为现在路线改为匹配没有路线匹配[GET]“/ posts / new”(注意复数帖子)。

答案 1 :(得分:0)

此处表单尝试通过路径&#34; posts_path&#34;找到到post_method的路由。 所以你需要在routes.rb文件中定义。

Rails.application.routes.draw do
get '/post' => 'post#index'
get '/post/new' => 'post#new'
post '/posts' => 'post#create'
end

答案 2 :(得分:0)

问题出在视图上。 Rails无法识别提交表单时将要运行的路径。
您可以手动更改form_for标记以指向适当的URL。
<%= form_for @post, :url => "enter_your_path_here" do |f| %>
这解决了我类似的问题

答案 3 :(得分:0)

您需要将后控制器和相应的文件重命名为复数。那是帖子而不是帖子。然后路线也必须是资源:帖子。

别忘了将您的Post Controller的类名更改为复数。