Ruby on rails 3 Rails 3-在另一个嵌套资源中构建嵌套资源(文章->评论->投票)

Ruby on rails 3 Rails 3-在另一个嵌套资源中构建嵌套资源(文章->评论->投票),ruby-on-rails-3,build,resources,nested,associations,Ruby On Rails 3,Build,Resources,Nested,Associations,在我的应用程序中有一个关联问题,我无法修复。 我的应用程序非常简单:有一个文章模型;每篇文章都有很多评论,这些评论中的每一条都有很多投票权,在我的例子中是“投票权”。 为了解释我的设计方式,我做了一个注释脚手架,编辑了注释模型,并将其路由到一个嵌套资源,一切正常。现在,我基本上再次对“upvotes”执行相同的过程,并再次编辑模型和路由,使其成为注释嵌套资源中的嵌套资源。但这在以下几点上失败了: NoMethodError in Articles#show Showing .../app/vie

在我的应用程序中有一个关联问题,我无法修复。 我的应用程序非常简单:有一个文章模型;每篇文章都有很多评论,这些评论中的每一条都有很多投票权,在我的例子中是“投票权”。 为了解释我的设计方式,我做了一个注释脚手架,编辑了注释模型,并将其路由到一个嵌套资源,一切正常。现在,我基本上再次对“upvotes”执行相同的过程,并再次编辑模型和路由,使其成为注释嵌套资源中的嵌套资源。但这在以下几点上失败了:

NoMethodError in Articles#show
Showing .../app/views/upvotes/_form.html.erb where line #1 raised:
undefined method `upvotes' for nil:NilClass
My_form.html.erb文件如下所示:

<%= form_for([@comment, @comment.upvotes.build]) do |f| %>
<%= f.hidden_field "comment_id", :value => :comment_id %>
<%= image_submit_tag "buttons/upvote.png" %>
<% end %>
和我的3款车型:

  class Article < ActiveRecord::Base
    attr_accessible :body, :title

    has_many :comments
  end

  class Comment < ActiveRecord::Base
    attr_accessible :content

    belongs_to :user
    belongs_to :article
    has_many :upvotes
  end

  class Upvote < ActiveRecord::Base
    attr_accessible :article_id, :comment_id, :user_id

    belongs_to :comment, counter_cache: true
  end
抱歉,代码太多了。如果有人能回答这个问题,他们会非常棒! 提前谢谢你

为什么在这种情况下“upvotes”没有定义,而在这里:

这是因为您正在对一个nil对象调用upvots,该注释还不存在

最好的做法是查看嵌套属性:


您的错误消息说,您尝试调用nil上的投票。具体来说,它是/app/views/upvoals/_form.html.erb视图中code@comment.upvoals.build的一部分

您必须通过添加@comment with contents变量来修复ArticlesController中的显示操作

  def show
    @upvote = Upvote.new(params[:vote])
    @article = Article.find(params[:id])
    @comments = @article.comments.paginate(page: params[:page])


    respond_to do |format|
      format.html # show.html.erb
      format.json { render json: @article }
    end
  end
在UpvotesController中,在创建操作中也发生了奇怪的事情


首先,您使用params[:id]获取了一篇@article,然后您通过关联获取了该@article的所有注释,其中注释id与@article id相同。请检查您的代码,它不一致,无法正常工作。

一切都已修复,现在可以正常工作。采取了不同的方法,只是简单地使用Upvote.new,而不是将其嵌套到评论和建立关联中,还编辑了我的路线。实现了马修·福特的想法


我怀疑你在文章页面上有很多评论,评论变量应该是本地的,例如@article.comments.each do | comment |,然后使用评论变量构建你的upvote表单


谢谢大家的帮助

谢谢你的回答和链接!然而,有一个问题:为什么评论是零对象?我以为我在我的upvote_控制器中用@comment=@article.comments.findparams[:id]定义了它?我怀疑你在文章页面上有很多评论,评论变量应该是本地的,例如@article.comments.each do | comment,然后使用评论变量来构建你的upvote表单。我认为这是正确的提示,但我无法实现这一点。在my articles show action中定义注释列表的方式是@comments=@article.comments.paginatepage:params[:page],仅此而已。在文章show view中,注释是通过render@comments呈现的。那么,我如何才能给每个评论一个id,一个识别,当上传投票表单时,我的上传投票和文章控制器可以使用它,实际上只是点击一下?当然,每个评论都有一个id,并且嵌套在一篇文章中,但是如何访问该id呢?非常感谢您的帮助!我同意我必须在我的文章的展示动作中定义我的@comment。然而,我不知道该怎么做。我尝试了@comment=@article.comments.findparams[:comment\u id],因为我的隐藏字段:comment\u id%>但是现在我得到了一个错误,没有id就找不到评论,所以我的主要问题似乎是评论的id没有得到正确的定义。我确实修复了upvote控制器中的代码。不客气!请解释一下,你想在你的文章ControllerShow中实现什么?你想展示一篇有一条评论的文章吗?还是带有评论列表的文章?应该是一篇带有评论列表的文章。我觉得问题在于,由于评论嵌套在文章中,因此评论id没有正确提交;根据我的理解,这样的提交需要包括投票的评论的article.id和comment.id。我觉得我的投票表需要修改:评论\u id%>
def show
    @upvote = Upvote.new(params[:vote])
    @article = Article.find(params[:id])
    @comments = @article.comments.paginate(page: params[:page])


    respond_to do |format|
      format.html # show.html.erb
      format.json { render json: @article }
    end
  end
  class Article < ActiveRecord::Base
    attr_accessible :body, :title

    has_many :comments
  end

  class Comment < ActiveRecord::Base
    attr_accessible :content

    belongs_to :user
    belongs_to :article
    has_many :upvotes
  end

  class Upvote < ActiveRecord::Base
    attr_accessible :article_id, :comment_id, :user_id

    belongs_to :comment, counter_cache: true
  end
  class CreateUpvotes < ActiveRecord::Migration
    def change
      create_table :upvotes do |t|
        t.integer :comment_id
        t.integer :user_id

        t.timestamps
      end
    end
  end
  resources :articles do
      resources :comments, only: [:create, :destroy] do
        resources :upvotes, only: [:new, :create]
      end
    end
  def show
    @upvote = Upvote.new(params[:vote])
    @article = Article.find(params[:id])
    @comments = @article.comments.paginate(page: params[:page])


    respond_to do |format|
      format.html # show.html.erb
      format.json { render json: @article }
    end
  end
@article = Article.find(params[:id])
@comment = @article.comments.find(params[:id])
@upvote = @comment.upvotes.build(params[:upvote])