2010-02-18 56 views
0

我有一個用戶模型,其中包含一個名爲,可以說,text1。在用戶/新表單中,我希望有4個單獨的文本框用於此文本1。在我的模型中,我將從這些框中獲取值,並將它們連接在一起作爲逗號分隔值並將它們存儲在數據庫中。爲了給你一個理解,這就是我想要的。如何在form_for中使用數組?

<input type="text" name="user[text1][]" /> 
<input type="text" name="user[text1][]" /> 
<input type="text" name="user[text1][]" /> 
<input type="text" name="user[text1][]" /> 

如何使用form_for輔助方法得到這個?現在請不要擔心模型中的訪問器方法,這一切都是照顧好的。萬分感謝。

回答

1

User模型

class User < ActiveRecord::Base 
    attr_accessor :text1_part1 
    attr_accessor :text1_part2 
    attr_accessor :text1_part3 
    attr_accessor :text1_part4 

    def before_validation 
     self.text1 = "#{self.text1_part1}#{self.text1_part2}#{self.text1_part3}#{self.text1_part4}" 
    end 
    # make sure you fill the correct values for 
    # the text parts for an existing record. 
    # This can be done by implementing `after_find` or overriding 
    # `text1=`. 
end 

添加幾個虛擬屬性在您的視圖代碼中使用新的屬性,而不是文本1

<% form_for(:user) do |f| %> 
    #some code 
    <%= f.text_field :text1_part1> 
    <%= f.text_field :text1_part2> 
    <%= f.text_field :text1_part3> 
    <%= f.text_field :text1_part4> 
    #some code 
    <%= f.submit "Save"> 
<% end %> 
+0

感謝您的回覆。但是這不是一種工作嗎?沒有明確的做法嗎?同樣在表單未通過模型驗證並再次載入的情況下,我希望文本框自動填入我在提交之前輸入的值。您的方法將要求我另外編寫用於將text1的內容分割爲其他三個文本框的代碼。我只是想知道rails是否有內置的用於處理這種形式的數組。謝謝。 – 2010-02-18 20:06:59

+0

在表單重新加載時,值將被保留爲'part'字段是模型上的虛擬屬性。對於您的情況,這是合法的做法,因爲您顯示的內容不是您保存的內容。 – 2010-02-18 20:22:35

0

以前的答案給出瞭解決方案,所以我只是提供一些背景爲什麼你要求不符合他們的方式,你可能會希望。

您的確可以創建一個具有多個同名輸入字段的表單,並且該數據將被髮布。但是,當rails收到帖子時,它會自動參數化發佈數據和/或url參數。它實質上分裂在&上,並將鍵/值對分配給參數散列。這樣做的結果是params [:user] [:text1](來自您的示例)將具有它遇到的用戶[text1]的最後一個實例的值,因爲它只是對現有密鑰的值賦值。您可能需要深入瞭解ActiveRecord多參數分配,以瞭解datetime屬性的工作方式,因爲它們與您的用例類似。

0

我正在做類似的事情,聽起來好像序列化是你正在尋找的。不幸的是,我還沒有解決我的問題,所以我不能提供更具體的問題。