2010-08-08 91 views
2

我正在嘗試爲我的表單拼合一個數組。Rails:Flatten array in parameter

def update 
    @tour = Tour.find(params[:id]) 
    params[:tour][:hotel_ids][0] = params[:tour][:hotel_ids][0].split(',') 
... 

這導致:

"hotel_ids"=>[["1","2"]] 

當然,我希望它是

"hotel_ids"=>["1","2"] 

我的表格:

<%= text_field_tag 'tour[hotel_ids][]', nil %> 

希望任何人都可以在這方面幫助。

編輯


我已經得到了它的工作,不知何故。這可能是一個糟糕的方式,雖然做到這一點:

我改變了這一切得到是從jQuery的到陣列的text_field:

<%= text_field_tag 'tour[h_ids][]', nil %> 

然後在我的控制器我所做的:

params[:tour][:hotel_ids] = params[:tour][:h_ids][0].split(',') 

這作品,我不得不將h_ids添加到attr_accessor。對於後來閱讀編碼器的人來說,這可能是一個很大的跆拳道...但這是可以接受的嗎?

+0

So params [:tour] [:hotel_ids] = params [:tour] [:hotel_ids] [0] .split(',') 沒有工作?因爲這完全是你在那裏做的,但沒有緩衝對象。 – Rock 2010-08-09 02:14:20

+0

沒有,它沒有工作... – Amund 2010-08-09 02:32:44

+0

順便說一句,**大**感謝你搖滾和MBO與我同在。至少在嘗試不同的事情之後,至少讓它工作是一個巨大的安慰。 – Amund 2010-08-09 02:53:18

回答

3

這是紅寶石!

params[:tour][:hotel_ids][0].flatten! 

應該這樣做!

ps:'!'在這裏很重要,因爲它會導致「扁平化」被保存到調用對象中。

PPS:對於那些紅寶石相關的問題,我強烈建議與IRB腳本/控制檯試驗。你可以把你的對象,並要求

object.inspect 
object.methods 
object.class 

這是調試和發現什麼紅寶石能爲你做的時候真的有用。

+0

在發佈之前,我在irb中進行了很多試驗,但我的問題是如何使它在rails中工作。讓我們說params [:tour] [:hotel_ids] [0] == [「1」,「2」,「3」]然後調用flatten就不會做任何事情。我真正需要打電話的是hotel_ids參數。 希望澄清。 – Amund 2010-08-08 23:29:49

+0

params [:tour] [:hotel_ids] .flatten! 不行嗎?不要忘記'!' params [:tour] [:hotel_ids] .class .inspect會返回什麼? 或嘗試緩衝區: buf = params [:tour] [:hotel_ids] [0]#或沒有[0] buf.flatten! 然後檢查你是否想要。 – Rock 2010-08-08 23:57:31

+0

等待。什麼是params [:tour] [hotel_ids] [0]到底是什麼?你需要調用split(',')來獲得一個Array嗎?然後,可以將.flatten(不帶'!')附加到params [:tour] [:hotel_ids] [0] = params [:tour] [:hotel_ids] [0] .split(',')。 – Rock 2010-08-09 00:00:54

0

在這裏只需使用<%= text_field_tag 'tour[hotel_ids]', nil %>,然後像在示例中那樣拆分。

真的發生在你的榜樣是什麼Rails的請求中獲得參數(-s)tour[hotel_ids][],並認爲:「好了,params[:tour][:hotel_ids]是一個數組,所以我只是把每一個值與此名稱作爲未來值這個數組「,你會得到這種行爲,你有一個元素在params[:tour][:hotel_ids]數組中,這是你的值(」1,2「)。如果你不需要(或不想)將多個值分配給同一PARAM那麼不創建數組(不要在名稱末尾添加[]

編輯:

你也可以去簡單的方法(如果你只是想回答貼出的問題,不解決,爲什麼你現在你所期望的有問題),只是改變你的行控制器:

params[:tour][:hotel_ids] = params[:tour][:hotel_ids][0].split(',') 

#split回報陣列和您的示例將此新數組分配給另一個數組的第一個位置。這就是爲什麼你有陣列陣列。

+0

這也是我最初的想法,但結果出來了「hotel_ids」=>「1,2」。我希望hotel_ids是從params [:tour] [:hotel_ids] [] – Amund 2010-08-09 00:06:45

+0

@Amund收集的多個對象的數組如果你想要多個對象,那麼在你的html中需要多個'' = true),否則你必須自己創建多個對象,例如分割(「,」),例如 – MBO 2010-08-09 00:22:35

+0

我是否還應該隱藏字段<%= hidden_​​field_tag'tour [hotel_ids]',nil%>? 我試圖改變控制器,但結果是:「hotel_ids」=> [「1,3」]但仍檢查params [:tour] [:hotel_ids] == [「1」,「3」] 當我嘗試使用hidden_​​field時,我得到了 狀態:500內部服務器錯誤 預期數組(獲取字符串)爲param'hotel_ids' – Amund 2010-08-09 01:06:21