2014-01-23 100 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