【问题标题】:Undefined local variable/method User未定义的局部变量/方法用户
【发布时间】:2015-11-10 00:11:51
【问题描述】:

我目前正在学习如何使用 faker gem 将数据植入我的项目中。我的项目是一个允许用户核对和添加项目的待办事项列表。我学会了如何创建自己的 RandomData,但在将 gem 改编到教程中时遇到了麻烦。我也不确定我是否正确地将其“改编”到教程中,所以我希望我能提供足够的信息。

运行rake db:reset时报错如下:

NameError: undefined local variable or method `user' for main:Object
itoff/db/seeds.rb:13:in `block in <top (required)>'
itoff/db/seeds.rb:11:in `times'
itoff/db/seeds.rb:11:in `<top (required)>'

我看到它在我的假物品循环中,但我不确定我做错了什么。请记住,我是 Ruby on Rails 的新手,所以如果我遗漏了一些明显的东西,我深表歉意。

使用设计和伪造的宝石。

(最后的问题:我能做的更好吗?我还应该努力/专注于什么才能在 ruby​​ on rails 上做得更好?)

seeds.rb

#Create fake user
5.times do
  user = User.new(
    email: Faker::Internet.email,
    password: Faker::Lorem.characters(10)
  )
  user.skip_confirmation!
  user.save!
end

#Create fake items
10.times do
  item = Item.create!(
    user: user.sample,
    name: Faker::Lorem.sentence
  )
end

puts "Seed finished"
puts "#{User.count} users created"
puts "#{Item.count} items created"

我的items_controller.rb

class ItemsController < ApplicationController

  def create
    @item = current_user.items.new(item_params)

    if @item.save
      redirect_to current_user, notice: "Item was saved successfully."
    else
      flash[:error] = "Error creating item. Please try again."
      render :new
    end
  end


  def destroy
     @item = Item.find(params[:id])

     if @item.destroy
       flash[:notice] = "\"#{@item.name}\" was deleted successfully."
       redirect_to action: :index
     else
       flash[:error] = "There was an error deleting the item."
       render :show
     end
   end

  private
  def item_params
    params.require(:item).permit(:name)
  end
end

item.rb

class Item < ActiveRecord::Base
  belongs_to :user
  validates :description, presence: true
end

user.rb

class User < ActiveRecord::Base
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :trackable, :validatable, :confirmable

         has_many :items
end

【问题讨论】:

  • 我的回答解决了你的问题吗?如果没有,您可以发布您遇到的新错误吗?
  • 是的!对不起,我一直忙于学校工作。谢谢你的帮助!!!

标签: ruby-on-rails


【解决方案1】:

有两个问题。出现错误是因为 seeds.rb 文件中的 user 变量超出范围。它位于do 块内。此外,您应该使用 User 类,而不是实例:

5.times do
  user = User.new( # This is inside of a do block
    email: Faker::Internet.email,
    password: Faker::Lorem.characters(10)
  )
  user.skip_confirmation!
  user.save!
end

#Create fake items
10.times do
  item = Item.create!(
    user: user.sample, # Which user? There is no user in this scope
    name: Faker::Lorem.sentence
  )
end

您需要做的是在User 类上调用.sample;但是,您不能只是这样挑选用户。你需要随机获取一个id

#Create fake items
user_ids = User.ids # See the capitalization of User
10.times do
  item = Item.create!(
    user_id: user_ids.sample,
    name: Faker::Lorem.sentence
  )
end

或者从所有ids 中获取id。你可以这样做:User.order("RANDOM()").first,这将抓取一个随机的User 模型。这将是:

#Create fake items
10.times do
  item = Item.create!(
    user: User.order("RANDOM()").first
    name: Faker::Lorem.sentence
  )
end

【讨论】:

  • 是的,Dbz 的回答涉及到这个问题。当您尝试创建新项目时,用户超出范围。因此,要解决此问题,您需要更改 user: user.sample for user_id: User.ids.sample (我猜这是该列的名称,因为您将其用作外键)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-26
相关资源
最近更新 更多