2014-01-23 74 views
1

我正在尝试使用矩阵;我有一个模型,有一个名为“板”属性,它只是一个4x4矩阵。我以我的视角展示这块板子。到现在为止还挺好。当我点击一个按钮,我送参数“板”有,例如,这样的结构:矩阵未定义的方法,字符串到矩阵

{"utf8"=>"✓", "game_master"=>{"board"=>"Matrix[[0, 0, 0, 0], [0, 0, 1, 1], [0, 0, 1, 0],  [1, 1, 0, 0]]"}, "commit"=>"Yolo"} 

另一方面,在控制器中,我试图通过创建板新的游戏管理员重新这款主板= Matrix [[0,0,0,0],[0,0,1,1],[0,0,1,0],[1,1,0,0]]。到目前为止这么好(不,我知道param [:board]只是一个字符串,这是我的问题)。然后,后来,试图迭代矩阵时,我得到这个错误:

undefined method `each_with_index' for "Matrix[[0, 0, 0, 0], [0, 0, 1, 1], [0, 0, 1, 0], [1, 1, 0, 0]]":String 

很显然,我势必:登上一个字符串不是一个矩阵。我将如何将该字符串转换为相应的矩阵?

感谢

UPDATE: game_masters_controller.rb

def step 
@game_master = GameMaster.new(game_master_params) 
@game_master.step 
respond_to do |format| 
    format.js 
end 
end 

和:

private 
def game_master_params 
    params.require(:game_master).permit(:board) 
end 

game_master.rb

def initialize(attributes = {}) 
attributes.each do |name, value| 
    send("#{name}=", value) 
end 
if(self.board == nil) 
    self.board = get_new_board 
end 
end 
+0

我们可以看到你指定PARAMS向董事会变量的代码?围绕代码的一点背景也可能有用。 – jklina

+0

完成!需要帮助请叫我。谢谢 – bsilvacs

回答

1

只需做:

arr = params[:game_master][:board].split(',').map(&:to_i).each_slice(4).to_a 
# => [[0, 0, 0, 0], [0, 0, 1, 1], [0, 0, 1, 0], [0, 1, 0, 0]] 

require 'matrix' 
matrix = Matrix[*arr] 
# => Matrix[[0, 0, 0, 0], [0, 0, 1, 1], [0, 0, 1, 0], [0, 1, 0, 0]] 
+0

谢谢,但我不认为这是我所需要的。由此产生的矩阵是矩阵矩阵。这意味着,当我尝试获取列x中的值y行时,我得到一个数组而不是一个数字。 – bsilvacs

+0

@ user3204217现在呢?更新了我的答案。 – Agis

0

快速而肮脏,不是很安全:

class GameMaster 
    ... 
    def board=(attr) 
    @board = eval attr 
    end 
end 
0

我会上得到通过表单提交的东西不运行EVAL。如果矩阵总是4x4,我可能会提交一个逗号分隔的字符串,如0,0,0,1,1,1,0 ...。然后我会使用String#split将大字符串转换为数组。一旦你有一个大的数组,你可以遍历它来生成,您可以发送到Matrix.new

string_params = 0,1,1,0,0,1 
array_of_string = string_params.split(',') 
array_of_arrays = array_of_string.each_slice(4).to_a 
matrix = Matrix.new(array_of_arrays) 

这应该指向你在正确的方向数组的数组。

祝你好运!

+0

这似乎更安全了,但是,我不得不操纵弦,对吧?删除前缀“矩阵”? – bsilvacs

+0

正确,你将不得不让你的表单返回一个大字符串中的所有值。你可以用简单的文本字段来做到这一点,或者变得更加花哨。 – jklina

0

尝试此代码: (如其他的答案提到的,它不是固定到从输入来的eval代码)

require 'matrix' 
m = eval "Matrix[[0, 0, 0, 0], [0, 0, 1, 1], [0, 0, 1, 0], [1, 1, 0, 0]]" 

=>矩阵[[0 ,0,0,0],[0,0,1,1],[0,0,1,0],[1,1,0,0]]

m.transpose 

=>矩阵[[ 0,0,0,1], [0,0,0,1],[0,1,0,0],[0,1,0,0]]

要求使用matrix.rb文件可以让你访问很多有用的方法,请查看文档以获取更多信息。

http://ruby-doc.org/stdlib-2.1.0/libdoc/matrix/rdoc/Matrix.html