首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Rails seed.db语法

Rails seed.db语法
EN

Stack Overflow用户
提问于 2017-02-01 09:27:49
回答 1查看 112关注 0票数 0

我有这个密码。rails的第一条和第二条命令运行良好,但是"project.todos << todo“部件ruby解释器将其视为错误。

代码语言:javascript
复制
NoMethodError: undefined method `todos' for nil:NilClass

我怎么才能修好它?当我输入像这样的seeds.rb文本时,一切都很好,但使用代码却不起作用:

代码语言:javascript
复制
#work
project = Project.create title: "Family"
todo = Todo.create text: "Buy milk", isCompleted: true
project.todos << todo

#code
require 'yaml'
yhash = YAML.load_file(File.open("#{Rails.root}/db/seeds.yml"))
yhash.each do |key, value|
  value.each do |k, v|
    k.each do |ke, proj|
      if proj.class.name == 'String'
        project = Project.create title: proj
      elsif proj.class.name == 'Array'
        proj.each do |todo|
          i = 0
          tmp = ''
          todo.each do |to|
            to.each do |t|
              if i == 0
                i = 1
              elsif i == 2
                i = 3
              elsif i == 1
                tmp = t
                i  = 2
              elsif i == 3
                if t == false
                  bool = 'false'
                else
                  bool = 'true'
                end
                todo = Todo.create text: tmp, isCompleted: bool
                project.todos << todo
                i = 0
                tmp = ''
              end
            end
          end
        end
      end
    end
  end
end
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-02-01 09:30:52

简短回答

你真的应该改变你的YAML结构,这会使一切变得容易得多。

代码语言:javascript
复制
---
projects:
- title: Family
  todos:
  - text: Buy milk
    is_completed: true
  - text: Todo2
    is_completed: false
- title: Project2
  todos:
  - text: Todo3
    is_completed: true
  - text: Todo4
    is_completed: false

您可以用几行代码解析它:

代码语言:javascript
复制
yaml = YAML.load(File.read('test.yaml'))

yaml['projects'].each do |project|
  title = project['title']
  p title
  # Create project here
  project['todos'].each do |todo|
    p todo
    # Create todo here
    # Add todo to project
  end
end

NoMethodError

代码语言:javascript
复制
NoMethodError: undefined method 'todos' for nil:NilClass

意味着没有定义调用todos的对象(project)。

实际上,project没有定义,但是proj是定义的,所以您应该首先创建一个名为projectProject

命名对象

为了避免混淆:

  • project_name可以是包含项目名称的字符串。
  • project_names可以是项目名称的数组。
  • project可以是Project对象
  • todos可以是Todo的数组

您的代码指示proj用于不同目的:

代码语言:javascript
复制
project = Project.create title: proj
proj.each do |todo|

这两个proj应该是不同的对象,具有不同的变量名,并且应该单独初始化。

在YAML中编写嵌套散列很容易,一个哈希可以表示Project,另一个可以表示Todo

块变量

如果在第一次迭代期间在循环中创建一个名为projectproject实例,则下一次迭代将无法使用它:

代码语言:javascript
复制
[1, 2, 3].each do |i|
  if i==1
    project = "my project"
  end
  p i
  p project
end
# 1
# "my project"
# 2
# nil
# 3
# nil

如果希望project变量对所有迭代都可用,则应该在循环的之外创建它:

代码语言:javascript
复制
project = "my project"
[1, 2, 3].each do |i|
  p i
  p project
end
# 1
# "my project"
# 2
# "my project"
# 3
# "my project"

另一种可能是使用@project而不是project

代码语言:javascript
复制
[1,2,3].each do |i|
  if i==1
    @project = "my project"
  end
  p i
  p @project
end
# 1
# "my project"
# 2
# "my project"
# 3
# "my project"

案例

而不是:

代码语言:javascript
复制
if proj.class.name == 'String'
        project = Project.create title: proj
      elsif proj.class.name == 'Array'

你可以用:

代码语言:javascript
复制
case proj
when String
  # proj is a String
when Array
  # proj is an Array
end
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41976148

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档