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

Posted

技术标签:

【中文标题】为啥我无法获得 /comments/new.html.erb?【英文标题】:Why can't I get /comments/new.html.erb?为什么我无法获得 /comments/new.html.erb? 【发布时间】:2017-02-11 13:23:04 【问题描述】:

我通过脚手架命令创建模型

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

cmets_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) %>

/cmets_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'

问题出在哪里?我该如何解决?

【问题讨论】:

&lt;%= link_to 'Add comment', new_post_comment_path (@post)%&gt; 尝试删除空格:&lt;%= link_to 'Add comment', new_post_comment_path(@post)%&gt; 空格无关紧要,有一致的间距很好,但是这一行的结果是一样的:(@post)变成@post,然后传递给new_post_comment_path,结果变成link_to的第二个参数 【参考方案1】:

正如错误所说,您遇到的错误位于 _cmets/form.html.erb

form_for(@comment)

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

form_for([@post, @comment])

【讨论】:

我在哪里可以发表评论? 对不起,我的意思是@comment,如果没有 cmets 并且您仍想显示表单,您可以使用 @comment = @post.comment.build 为您的表单创建一个空评论。 我试过 我出错了。我猫明天写这个错误。我忘了在工作电脑上提交 添加评论链接没问题,错误出现在您的实际表单上(请参阅我的回答:错误出现在 _cmets/form.html.erb 上。【参考方案2】:

这是因为您不仅有 '/comments/new' 路径,而是 form_for(@comment) 正在尝试创建它。

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

还可以在新方法中添加 @post = Post.find(params(:is)) 或更好地作为 before_action 回调。

【讨论】:

我在帖子中写过#new:我得到了同样的错误@post=Post.find(params[post_id]) @comment =@post.cmets.new 1.你想使用的路线是:posts/:post_id/comments:/new,所以你的链接应该是link_to 'Add Comment', new_post_comment_path(@post)。在commentscontroller#new 你必须找到@post,并建立新的@comment。 @post.cmets.new 或 @post.cmets.build。你的 form_for 应该看起来像 form_for([@post, @comment]) 我已经更正了 form_for 和 cmets/new 并且它有效。谢谢。

以上是关于为啥我无法获得 /comments/new.html.erb?的主要内容,如果未能解决你的问题,请参考以下文章

为啥没有滚动条我无法获得容器宽度?

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

Django:为啥我在运行 LiveServerTestCase 测试时无法获得回溯(以防出错)?

为啥我无法获得 select2 下拉列表的先前值

为啥我无法通过 Prolog 获得 Ship Puzzle 的答案?

为啥我无法获得对地图中某个值的引用? [复制]