Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 如何将用户输入与对象属性匹配_Ruby On Rails_Ruby_Object_Input_Properties - Fatal编程技术网

Ruby on rails 如何将用户输入与对象属性匹配

Ruby on rails 如何将用户输入与对象属性匹配,ruby-on-rails,ruby,object,input,properties,Ruby On Rails,Ruby,Object,Input,Properties,我给了一些对象各种属性。然后我想显示属性与用户输入匹配的对象: Car = Struct.new( :model, :color, :number_doors) matrix = Car.new( matrix, blue, 4) fit = Car.new( fit, silver, 2) volvo = Car.new( volvo, silver, 4) cars = [matrix, fit, volvo] puts "What color car do you want?" re

我给了一些对象各种属性。然后我想显示属性与用户输入匹配的对象:

Car = Struct.new( :model, :color, :number_doors)

matrix = Car.new( matrix, blue, 4)
fit = Car.new( fit, silver, 2)
volvo = Car.new( volvo, silver, 4)

cars = [matrix, fit, volvo]

puts "What color car do you want?"
response = gets.chomp

# something like 
# if response == cars[X].color
# puts "We have #{cars[X].model} available

首先,您应该将参数作为
String
传递以创建对象

  • matrix=Car.new('matrix','blue',4)
  • fit=Car.new('fit','silver',2)
  • volvo=Car.new('volvo','silver',4)
生成所需输出的代码与您编写的代码类似

       (0...cars.length).each do |x|
         if response == cars[x].color
            puts "We have #{cars[x].model} available"
         end
       end

首先,您应该将参数作为
String
传递以创建对象

  • matrix=Car.new('matrix','blue',4)
  • fit=Car.new('fit','silver',2)
  • volvo=Car.new('volvo','silver',4)
生成所需输出的代码与您编写的代码类似

       (0...cars.length).each do |x|
         if response == cars[x].color
            puts "We have #{cars[x].model} available"
         end
       end

假设您正确创建了
汽车
实例:

matrix = Car.new(:matrix, :blue, 4)
然后可以使用
Array#any?
方法检查数组中的任何元素的计算结果是否为true:

cars.any? { |car| car.color.to_s == response }
# returns true or false
因此,您的代码将变成:

puts "We have #{cars[x].model} available" if cars.any? { |car| car.color.to_s == response }

假设您正确创建了
汽车
实例:

matrix = Car.new(:matrix, :blue, 4)
然后可以使用
Array#any?
方法检查数组中的任何元素的计算结果是否为true:

cars.any? { |car| car.color.to_s == response }
# returns true or false
因此,您的代码将变成:

puts "We have #{cars[x].model} available" if cars.any? { |car| car.color.to_s == response }

首先让我们明确这些参数(
matrix
blue
等)必须是字符串或符号。事实上,它们是变量,而且由于之前没有对它们进行定义,因此代码中会出现一些
未定义变量XXX
错误

此外,当你写下这样的东西时:

matrix = Car.new( matrix, blue, 4)
cars = [ { model: 'matrix', color: 'blue', doors: 4}, {model: 'fit', color: 'silver', doors: 2}, { model: 'volvo', color: 'silver', doors: 4} ]

puts "What color car do you want?"
response = gets.chomp

cars.each{ |car| puts "We have #{car[:model]} available" if car[:color] == response }
cars = get_cars_data
您有一个循环定义,因为在外部定义的
矩阵
取决于先前在内部定义的
矩阵

您的代码应该类似于:

matrix = Car.new( matrix, blue, 4)
cars = [ { model: 'matrix', color: 'blue', doors: 4}, {model: 'fit', color: 'silver', doors: 2}, { model: 'volvo', color: 'silver', doors: 4} ]

puts "What color car do you want?"
response = gets.chomp

cars.each{ |car| puts "We have #{car[:model]} available" if car[:color] == response }
cars = get_cars_data
请注意,您不需要为每辆可用的汽车指定名称。如果从大型数据库中读取可用的汽车,这将是不可能的,而在上面的解决方案中(使用哈希数组存储汽车数据),这不会是一个问题

这就引出了一个“大局建议”:永远不要考虑硬编码可能会改变的事情。

在这种情况下,如果您考虑过基于此代码的实际应用程序,您将如何维护您的汽车更新,必须手动插入每辆新车,最糟糕的是,为其实例找到不同的名称

按照我上面介绍的方式,如果从数据库中读取您的汽车,您只需编写如下内容:

matrix = Car.new( matrix, blue, 4)
cars = [ { model: 'matrix', color: 'blue', doors: 4}, {model: 'fit', color: 'silver', doors: 2}, { model: 'volvo', color: 'silver', doors: 4} ]

puts "What color car do you want?"
response = gets.chomp

cars.each{ |car| puts "We have #{car[:model]} available" if car[:color] == response }
cars = get_cars_data

其中get_cars_data是一种读取数据库的方法。唯一的要求是,此方法将每辆车返回为带有
:model
:color
:doors
键的散列。首先,让我们明确这些参数(
矩阵
蓝色
等)必须是字符串或符号。事实上,它们是变量,而且由于之前没有对它们进行定义,因此代码中会出现一些
未定义变量XXX
错误

此外,当你写下这样的东西时:

matrix = Car.new( matrix, blue, 4)
cars = [ { model: 'matrix', color: 'blue', doors: 4}, {model: 'fit', color: 'silver', doors: 2}, { model: 'volvo', color: 'silver', doors: 4} ]

puts "What color car do you want?"
response = gets.chomp

cars.each{ |car| puts "We have #{car[:model]} available" if car[:color] == response }
cars = get_cars_data
您有一个循环定义,因为在外部定义的
矩阵
取决于先前在内部定义的
矩阵

您的代码应该类似于:

matrix = Car.new( matrix, blue, 4)
cars = [ { model: 'matrix', color: 'blue', doors: 4}, {model: 'fit', color: 'silver', doors: 2}, { model: 'volvo', color: 'silver', doors: 4} ]

puts "What color car do you want?"
response = gets.chomp

cars.each{ |car| puts "We have #{car[:model]} available" if car[:color] == response }
cars = get_cars_data
请注意,您不需要为每辆可用的汽车指定名称。如果从大型数据库中读取可用的汽车,这将是不可能的,而在上面的解决方案中(使用哈希数组存储汽车数据),这不会是一个问题

这就引出了一个“大局建议”:永远不要考虑硬编码可能会改变的事情。

在这种情况下,如果您考虑过基于此代码的实际应用程序,您将如何维护您的汽车更新,必须手动插入每辆新车,最糟糕的是,为其实例找到不同的名称

按照我上面介绍的方式,如果从数据库中读取您的汽车,您只需编写如下内容:

matrix = Car.new( matrix, blue, 4)
cars = [ { model: 'matrix', color: 'blue', doors: 4}, {model: 'fit', color: 'silver', doors: 2}, { model: 'volvo', color: 'silver', doors: 4} ]

puts "What color car do you want?"
response = gets.chomp

cars.each{ |car| puts "We have #{car[:model]} available" if car[:color] == response }
cars = get_cars_data

其中get_cars_data是一种读取数据库的方法。唯一的要求是,此方法将每辆车返回为带有
:model
:color
:doors
键的散列。

首先,您必须注意
矩阵
蓝色
适合
银色
沃尔沃
。。。所有这些参数都应该是字符串(“矩阵”)或符号(:矩阵)。例如,现在定义矩阵的方式取决于循环依赖中的自身。欢迎使用堆栈溢出。我建议阅读“”,包括链接的页面,尤其是那些很长但非常有用的页面。我们不在乎你是新来的,我们想要问得好的问题。首先,你必须注意
矩阵
蓝色
适合
银色
沃尔沃
。。。所有这些参数都应该是字符串(“矩阵”)或符号(:矩阵)。例如,现在定义矩阵的方式取决于循环依赖中的自身。欢迎使用堆栈溢出。我建议阅读“”,包括链接的页面,尤其是那些很长但非常有用的页面。我们不在乎你是不是新手,我们想要的是问得很好的问题。在这种情况下,为了得到完整的回答,你应该向OP展示如何创建一款车型
汽车
。如果您按照显示OP的方式运行代码,您将得到
cars.rb:8:in
':未初始化常量Car(namererror)
,因为Ruby不会识别任何名为
Car`的对象,除非您之前在某个地方定义了它。在这种情况下,要获得完整的响应,您应该向OP显示如何创建模型
Car
。如果您按照显示OP的方式运行代码,您将得到
cars.rb:8:in
':未初始化的常量Car(namererror)
,因为Ruby不会识别任何名为
Car`的对象,除非您之前在某个地方定义了它。在这种情况下,要获得完整的响应,您应该向OP显示如何创建模型Car。如果按照显示OP的方式运行代码,则会得到cars.rb:8:in':未初始化