尽管连接模型,未定义的方法'name'为:NilClass,sqlite3

时间:2015-03-30 23:30:47

标签: ruby-on-rails ruby sqlite

嘿伙计我通过WatchList在用户电影之间设置了很多很多。这是一个搜索itunes api电影的应用程序,在这里我为用户添加了将搜索到的电影保存到个人列表的能力。我正在使用Rails 4.1.1和sqlite3。

class User < ActiveRecord::Base

  has_secure_password

  validates :email, presence: true, uniqueness: true
  validates :name, presence: true
  validates :password, length: { minimum: 6 }, allow_nil: true

  has_many :watch_lists
  has_many :movies, through: :watch_lists

  def add_movie(movie)
  self.movies << movie
end

class Movie < ActiveRecord::Base
  has_many :watch_lists
  has_many :users, through: :watch_lists
end

class WatchList < ActiveRecord::Base
  belongs_to :user
  belongs_to :movie
end

我的问题是当我尝试添加使用itunes id为DB:id的电影时。在第7行的saves_controller中,它为nil:NilClass抛出未定义的方法'name'。我无法弄清楚,没有什么是零?使用正确的信息,电影可以保存到db。当我尝试创建连接表时。什么是rails试图在???

上调用'name'

第7行引发错误current_user.movi​​es&lt;&lt; @movie =&gt;未定义的方法'名称为nil:NilClass

class SavesController < ApplicationController
def create
  temp_movie = aquire_movie
  @movie = Movie.new(temp_movie.local_db_movie_info_hash)

  if @movie.save
    current_user.movies << @movie #### => LINE 7 ERROR undefined methond 'name for nil:NilClass
    redirect_to @movie
  end
end

private

def aquire_movie
  movie_data = itunes_results[:results][0]
  TemporaryMovie.new(movie_data)
end

def itunes_results
  data_retriever.get_data(params[:movie_id], search_by_id: true)
end

这也是架构。

    ActiveRecord::Schema.define(version: 20150330012300) do

  create_table "movies", force: true do |t|
    t.string   "title"
    t.datetime "created_at"
    t.datetime "updated_at"
  end

  create_table "users", force: true do |t|
    t.string   "name"
    t.string   "email"
    t.string   "password_digest"
    t.string   "auth_token"
    t.datetime "created_at"
    t.datetime "updated_at"
  end

  add_index "users", ["auth_token"], name: "index_users_on_auth_token"
  add_index "users", ["email"], name: "index_users_on_email"

  create_table "watch_lists", force: true do |t|
    t.integer  "movie_id"
    t.integer  "user_id"
    t.datetime "created_at"
    t.datetime "updated_at"
  end
end

更新

我只是有一个朋友克隆这个回购,他没有问题所以它是某种宝石/数据库问题?

2 个答案:

答案 0 :(得分:2)

所以我有点找到答案。 NoMethodError in CartsController#destroy - Agile Web Development with Rails 4

基本上更新了rails 4.1.1 =&gt; 4.1.2,错误消失了。 Active Record中的某种bug我相信它归结为什么。

当我运行rspec时,我也“收到警告:循环参数引用 - 反射”。这导致我上面的帖子。

答案 1 :(得分:0)

我认为你不希望raise在每个创作中都有例外。

创建的标准模式是:

def create
  @movie = Movie.new(movie_params)
  if @movie.save
    redirect_to @movie
  else
    render 'new'
  end
end

当电影属于current_user时:

def create
  @movie = current_user.movies.new(movie_params)
  if @movie.save
    redirect_to @movie
  else
    render 'new'
  end
end