为什么我无法获得/comments/new.html.erb?

时间:2016-10-03 14:43:06

标签: ruby-on-rails routes form-for scaffold

我通过脚手架命令

创建了模型
class Post < ActiveRecord::Base
  has_many :comments, as: :commentable
end

class Comment < ActiveRecord::Base
  belongs_to :commentable , polymorphic: true
end

...

routes.rb中:

 resources :posts, :images, :links do
    resources :comments
 end

comments_controller.rb:

def new
  @comment = Comments.new
end

/posts/show.html.erb:

 <%= link_to 'Add comment', new_post_comment_path (@post)%>

我认为我需要......(@ post,@ comment),例如来自http://guides.rubyonrails.org/routing.html

<%= link_to 'Ad details', magazine_ad_path(@magazine, @ad) %>

但我没有@comment在这里。

我收到错误:

    Showing /home/loza/Projects/my_blog/app/views/comments/_form.html.erb where line #1 raised:

    undefined method `comments_path' for #<#<Class:0x007f2e4a77c2f0>:0x007f2e4ab23ef8>

Extracted source (around line #1): 
<%= form_for(@comment) do |f| %>
  <% if @comment.errors.any? %>
    <div id="error_explanation">
      <h2><%= pluralize(@comment.errors.count, "error") %> prohibited this comment from being saved:</h2>

      <ul>

我需要写这样才能获得/comments/new.html.erb

今天我更正了我的代码: /posts/show.html.erb:

<%= link_to 'New comment', new_post_comment_path(@post, @post.comments.build) %>

/comments_controller.rb:

  def new
    @post = Post.find(params[:post_id])
    @comment = @post.comments.new
  end

我又遇到了同样的错误:

Showing /home/loza/Projects/my_blog/app/views/comments/_form.html.erb where line #1 raised:

undefined method `comments_path' for #<#<Class:0x007fa736859320>:0x007fa73669e238>

xtracted source (around line #1):

  <%= form_for(@comment) do |f| %>
  <% if @comment.errors.any? %>
    <div id="error_explanation">
      <h2><%= pluralize(@comment.errors.count, "error") %> prohibited this comment from being saved:</h2>

app/views/comments/_form.html.erb:1:in `_app_views_comments__form_html_erb___1254360398011104975_42800220'
app/views/comments/new.html.erb:3:in `_app_views_comments_new_html_erb__2117553728149416519_42948680'

哪里有问题?我该如何解决?

2 个答案:

答案 0 :(得分:1)

正如错误所示,您收到的错误在_comments / form.html.erb 上:

form_for(@comment)

你需要@post对象,form_for才能找到正确的路径:

form_for([@post, @comment])

答案 1 :(得分:0)

因为您没有'/comments/new'路径,但form_for(@comment)正试图创建它。

您的路线正在创建'/post/:id/comments/new'之类的路径,因此您必须使用form_for([@post, @comment])

同样在新方法中添加@post = Post.find(params(:is))或者更好地在before_action回调中添加。{/ p>