在每个EXISTING属性上获取NoMethodError(未定义的方法)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在每个EXISTING属性上获取NoMethodError(未定义的方法)相关的知识,希望对你有一定的参考价值。

如果我将movie = Movie.limit(1)输入控制台,我会得到

SELECT  "movies".* FROM "movies" LIMIT $1  [["LIMIT", 1]] => #<ActiveRecord::Relation [#<Movie id: 2, title: "Superman", rating: "PG", total_gross: 0.134218018e9, created_at: "2019-02-20 07:42:18", updated_at: "2019-02-20 08:17:24", description: "Clark Kent grows up to be the greatest super-hero", released_on: "1978-12-15">]>

但是,如果我输入movie.title,而不是获得“超人”,我得到:

Traceback (most recent call last):
    1: from (irb):2
Movie Load (0.6ms)  SELECT  "movies".* FROM "movies" LIMIT $1  [["LIMIT", 1]]
NoMethodError (undefined method `title' for #<Movie::ActiveRecord_Relation:0x000055b334842668>)

花了最后三个小时寻找原因无济于事。

编辑:我的班级有方法:

def index
  @movies = Movie.all
end

但是当我从索引视图中调用它时,没有一个属性可以工作:

<% @movies.each do |f| %>
  f.title
<% end %>

Movies#index中的ArgumentError

更新:我的数据库中有一个空行,每个属性返回nil。删除此行可修复此问题。

答案

在ApplicationRecord继承类上应用limit时,会得到一个ActiveRecord_Relation,换句话说,就是属于该特定模型的不同对象的集合(数组)。

所以,这解释了你得到的错误,title不能用作Movie::ActiveRecord_Relation的方法,但它适用于Movie对象,所以你还需要做一个额外的步骤,即从中访问特定的记录。限制结果。

movie = Movie.limit(1).first

如果限制大于1,那将是合理的,但你也可以看到take和/或first(两者都可以接收要查询的记录数量)。

以上是关于在每个EXISTING属性上获取NoMethodError(未定义的方法)的主要内容,如果未能解决你的问题,请参考以下文章

The container 'Maven Dependencies' references non existing library '

如何最好地应用更新逻辑

Django 为每个 filter() 调用命中数据库

MyBatisBatchItemWriter Cannot change the ExecutorType when there is an existing transaction

ERRno::ECONNRESTE: An existing connection was forcibly closed by the remote

在没有很多 jQuery 请求的情况下获取传递的元素属性和属性