rails undefined方法`reviewer'for#

时间:2013-12-09 16:58:56

标签: ruby-on-rails ruby ruby-on-rails-4 associations

我正在为我的帖子创建评论,所有作品,但我不知道如何显示谁撰写评论 我正在尝试这个:

class User < ActiveRecord::Base
  has_many :posts
  has_many :reviewers, :class_name => 'Post', :foreign_key => 'reviewer_id'
end

class Post < ActiveRecord::Base
  belongs_to :user
  belongs_to :category
  has_many :reviews
  belongs_to :reviewers, class_name: 'User', :foreign_key => 'reviewer_id'
  default_scope -> { order('created_at DESC') }
end

class Review < ActiveRecord::Base
  belongs_to :post
  belongs_to :user
end

class ReviewsController < ApplicationController
    def new
        @post = Post.find(params[:post_id])
        @review = @post.reviews.new(post_id:params[:post_id])
    end

    def create
        @post = Post.find(params[:post_id])
        @review = @post.reviews.build(review_params)
        if @review.save
          flash[:success] = "Ваш отзыв добавлен"
          redirect_to post_path @post
        else
          render 'new'
        end
    end


    private

    def review_params
        params.require(:review).permit(:post_id, :body, :reviewer_id).merge(:reviewer_id => current_user.id)
    end
end

和我的观点

<% @post.reviews.each do |review| %>
  <p>
    <strong>reviewer:</strong>
    <%= review.reviewer.email %>
  </p>

  <p>
    <strong>review:</strong>
    <%= review.body %>
  </p>
<% end %>

我的迁移

class CreateReviews < ActiveRecord::Migration
  def change
    create_table :reviews do |t|
      t.text :body
      t.references :post, index: true
      t.references :reviewer, index: true

      t.timestamps
    end
  end
end

但是给出了错误未定义的方法`reviewer'for# 帮助请dsfsdf

3 个答案:

答案 0 :(得分:2)

我认为你有一个复数问题:

帖子有许多审核人员(每次审核一次)的评论。但是您将外键存储在帖子中,因此您编写了有问题的行:

belongs_to :reviewers, class_name: 'User', :foreign_key => 'reviewer_id'

这里的问题是它是一个带有复数名称的单数关联。

我认为你试图在这里说一个

class Post
  have_many :reviewers, class_name: 'User', through: :reviews
end

但是,当您尝试从评论中访问评论者时,您真正需要的是添加:

class Review
  belongs_to :reviewer, class_name: 'User'
end

然后,您可以按预期访问评论中的评论者:

<% @post.reviews.each do |review| %>
  <p>
    <strong>reviewer:</strong>
    <%= review.reviewer.email %>
  </p>

  <p>
    <strong>review:</strong>
    <%= review.body %>
  </p>
<% end %>

用户中也有错误:

has_many :reviewers, :class_name => 'Post', :foreign_key => 'reviewer_id'

应该是:

has_many :reviews, :foreign_key => 'reviewer_id'

答案 1 :(得分:0)

您需要使用.user。检查模型中的belongs_to

Review.first.user

答案 2 :(得分:0)

正如之前的海报指出的那样,您的用户关联评论是:用户,因此您的视图应该如下所示:

<% @post.reviews.each do |review| %>
  <p>
    <strong>reviewer:</strong>
    <%= review.user.name unless review.user.nil? %>
  </p>

  <p>
    <strong>review:</strong>
    <%= review.body %>
  </p>
<% end %>