2012-11-22 90 views
10

我們使用ActiveRecord的「序列化」功能類似這樣的Rails:如何在表單中顯示Rails ActiveRecord模型的序列化數組屬性?

class User < ActiveRecord::Base 
    serialize :favorite_colors, Array 
    .... 
end 

所以我們可以有

u = User.last 
u.favorite_colors = [ 'blue', 'red', 'grey' ] 
u.save! 

所以基本上ActiveRecord的序列化是在一個數據庫之上的陣列,並將其存儲字段名爲favorite_colors。

我的問題是:你如何讓用戶在表單中輸入他喜歡的顏色? 你使用一系列文本框嗎?一旦他們進入,你如何以一種形式展示他們來編輯?

這是一個與Rails Form Helpers有關的序列化數組屬性的問題。

感謝

回答

2

要允許訪問AR屬性,你必須給予他們這樣的:

class User < ActiveRecord::Base 
    serialize :favorite_colors, Array 
    attr_accessible :favorite_colors 
    .... 
end 
+0

謝謝,但我的問題是關於如何在窗體中顯示此數組屬性以允許編輯此字段。 –

+0

哦對不起 - 誤會了......即使我編輯了這個問題 - 我的錯 – awenkhh

3

如果你想多選 HTML領域,嘗試:

= form_for @user do |f| 
    = f.select :favorite_colors, %w[full colors list], {}, :multiple => true 

如果您使用的是simple_form寶石,您可以選擇複選框方便:

= simple_form_for @user do |f| 
    = f.input :favorite_colors, as: :check_boxes, collection: %w[full colors list] 
+1

感謝您的評論。但是,我不希望用戶從預定義的顏色列表中進行選擇。我希望用戶在一系列文本框中輸入顏色。每種顏色一個文本框。我能爲此使用一些表單助手嗎?或者我必須自己編寫代碼,例如在窗體中創建「虛擬」屬性,然後在調用控制器中的update_attribites之前將它們合併到數組中。 –

2

我已通過「平坦化」在視圖中陣列和 重構控制器中的陣列解決了這個問題。

模型也需要進行一些更改,請參見下文。

class User < ActiveRecord::Base 

    serialize :favorite_colors, Array 

    def self.create_virtual_attributes (*args) 
     args.each do |method_name| 
      10.times do |key| 
       define_method "#{method_name}_#{key}" do 
       end 
       define_method "#{method_name}_#{key}=" do 
       end 
      end 
     end 
    end 

    create_virtual_attributes :favorite_colors 
end 

如果不這樣定義上述方法時,Rails會抱怨表單元素的 名字在視圖中,如「favorite_colors_0」(見下文)。

在視圖中,我動態創建10個文本字段,favorite_colors_0,favorite_colors_1等

<% 10.times do |key| %> 
    <%= form.label :favorite_color %> 
    <%= form.text_field "favorite_colors_#{key}", :value => @user.favorite_colors[key] %> 
<% end %> 

在控制器中,我必須合併favorite_colors_ *文本字段到一個數組前調用 節省或update_attributes方法:

unless params[:user].select{|k,v| k =~ /^favorite_colors_/}.empty? 
    params[:user][:favorite_colors] = params[:user].select{|k,v| k =~ /^favorite_colors_/}.values.reject{|v| v.empty?} 
    params[:user].reject! {|k,v| k=~ /^favorite_colors_/} 
end 

我正在做的一件事是硬編碼10,這限制了可以在favorite_colors數組中有多少元素。在表單中,它還輸出10個文本字段。我們可以很容易地改變10到100。但我們仍然會有一個限制。歡迎您提出如何消除此限制的建議。

希望你覺得這篇文章有用。

相關問題