为什么我在rails应用程序中获得未定义的方法`comments'?

时间:2018-02-10 16:46:24

标签: ruby-on-rails ruby

我有电影数据库(TMDb)的API。我想让应用程序单独审核。我创造了所有的东西,但这个错误使得被吸引?我怎么能摆脱这个?

我的错误是:

NoMethodError in ReviewsController#create

undefined method `comments' for #<Review:0x00000005278fa8> Did you mean? comment comment? comment=
 @review = current_user.reviews.new(review_params.merge(movie_id: @movie.id))

 if @review.save  # I got error here!!!
   flash[:success] = "Review saved!"
   redirect_to root_path
 else
   flash[:alert] = "Woops! It seems there was an error."
   redirect_to root_path
 end

回顾Params

def review_params
  params.require(:review).permit(:comment)
end

我的movie.rb是:

class Movie < ApplicationRecord
    validates :title, :release_date, :released, :runtime, :popularity, :language, :budget, :average_vote, :vote_count, :tmdb_id, presence: true
    has_many :reviews
end

我的review.rb是:

class Review < ApplicationRecord
  belongs_to :user
  belongs_to :movie

  validates :user, :movie, :comments, presence: true
end

我的user.rb是:

class User < ApplicationRecord
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :trackable, :validatable
  validates :username, presence: true
  validates_uniqueness_of :username
  mount_uploader :avatar, AvatarUploader

  has_many :reviews
end

3 个答案:

答案 0 :(得分:1)

您的错误消息显示:

  

#<Review:0x00000005278fa8>的未定义方法'评论'。你的意思是?评论评论?注释=

此语法#<Review:0x00000005278fa8>引用Review类的实例。

查看此代码:

class Review
  def show
    puts "I'm a review"
  end
end

review = Review.new
puts review

review.show
review.comments

--output:--
#<Review:0x007fa4db0a5bb8>
I'm a review

1.rb:10:in `<main>': undefined method `comments' for #<Review:0x007fa4db0a5bb8> (NoMethodError)

这个错误看起来很熟悉吗?该错误表示在Review类中没有定义名为comments()的方法。

您的错误甚至会问你

  你的意思是?评论评论?注释=

即。您的方法名称实际拼写为“评论”,“评论?”或“评论=”?

此处发生错误的原因是:

if @review.save  # I got error here!!!

是因为该行代码会导致您在Review类中指定的验证执行:

  

创建并保存新记录将向其发送SQL INSERT操作   数据库。更新现有记录将发送SQL UPDATE   操作而不是。验证通常在这些命令之前运行   被发送到数据库。如果任何验证失败,则对象将是   标记为无效,Active Record将不执行INSERT或   更新操作。这样可以避免在中存储无效对象   数据库。您可以选择在运行时运行特定验证   对象已创建,保存或更新。

http://guides.rubyonrails.org/active_record_validations.html

以下是rails指南中的一个示例:

class Person < ApplicationRecord
  validates :name, presence: true
end

Person.create(name: "John Doe").valid? # => true
Person.create(name: nil).valid? # => false
     

正如您所看到的,我们的验证让我们知道我们的人不是   有效且没有名称属性。

答案 1 :(得分:1)

错误看起来像是Review模型上的验证。这条线

validates :user, :movie, :comments, presence: true
在尝试将记录实际保存到数据库之前,

实际上会调用@review.comments.present?。但是,错误告诉您@review.comments存在问题 - #comments对象上不存在@review方法。

你所显示的错误也试图给你一个提示,它在哪里读取&#34;你的意思是评论,评论?,评论=&#34;,表明有一个类似名称的方法(单数comment)也许你有一个错字。您可能只需要将app/models/review.rb中的验证调整为

validates :user, :movie, :comment, presence: true

答案 2 :(得分:0)

根据错误消息判断该字段为comment而不是comments