2012-11-22 21 views
10

Chúng tôi đang sử dụng tính năng "serialize" của ActiveRecord trong Rails như thế này:Làm thế nào để hiển thị một thuộc tính Array được tuần tự hóa cho một Mô hình Rails ActiveRecord trong một biểu mẫu?

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

Vì vậy, chúng ta có thể có

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

Vì vậy, về cơ bản ActiveRecord là serializing mảng trên và lưu trữ nó trong một cơ sở dữ liệu lĩnh vực được gọi là favorites_colors.

Câu hỏi của tôi là: Làm thế nào để bạn cho phép người dùng nhập màu sắc yêu thích của mình trong một biểu mẫu? Bạn có sử dụng một loạt các trường văn bản không? Và một khi chúng được nhập vào, làm cách nào để hiển thị chúng dưới dạng để anh ấy chỉnh sửa?

Đây là câu hỏi liên quan đến Trình trợ giúp biểu mẫu Rails cho thuộc tính mảng được tuần tự hóa.

Cảm ơn

Trả lời

2

Để cho phép truy cập vào AR thuộc tính, bạn phải cấp cho họ như thế này:

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

Cảm ơn bạn, nhưng câu hỏi của tôi là về cách hiển thị thuộc tính mảng này trong Biểu mẫu để cho phép chỉnh sửa trường này. –

+0

oh xin lỗi - đã hiểu lầm nó ... mặc dù tôi đã chỉnh sửa câu hỏi - lỗi của tôi – awenkhh

3

Nếu bạn muốn chọn nhiều lĩnh vực HTML, hãy thử:

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

Nếu bạn đang sử dụng simple_form đá quý, bạn có thể hiển thị các tùy chọn dưới dạng hộp kiểm dễ dàng:

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

Cảm ơn nhận xét. Tuy nhiên, tôi không muốn người dùng chọn từ danh sách các màu được xác định trước.Tôi muốn người dùng tự nhập màu vào một loạt các hộp văn bản. Một hộp văn bản cho mỗi màu. Tôi có thể sử dụng một số người trợ giúp biểu mẫu cho việc này không? Hoặc tôi có phải mã này bản thân mình, chẳng hạn như, tạo ra "ảo" thuộc tính trong các hình thức và sau đó hợp nhất chúng vào một mảng trước khi gọi update_attribites trong bộ điều khiển? –

2

Tôi đã giải quyết vấn đề này bằng cách 'làm phẳng' mảng trong dạng xem và hoàn nguyên mảng trong bộ điều khiển.

Một số thay đổi cũng cần thiết trong mô hình, xem bên dưới.

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 

Nếu bạn không xác định phương pháp như trên, Rails sẽ phàn nàn về tên các yếu tố hình thức trong quan điểm, chẳng hạn như "favorite_colors_0" (xem dưới đây).

Trong giao diện, tôi tự động tạo ra 10 lĩnh vực văn bản, favorite_colors_0, favorite_colors_1 vv

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

Trong bộ điều khiển, tôi phải kết hợp các favorite_colors_ * lĩnh vực văn bản vào một mảng TRƯỚC gọi tiết kiệm hoặc 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 

Một điều tôi đang làm là viết mã 10, giới hạn số lượng phần tử bạn có thể có trong mảng favorites_colors. Trong biểu mẫu, nó cũng xuất ra 10 trường văn bản. Chúng ta có thể thay đổi 10 đến 100 dễ dàng. Nhưng chúng ta vẫn sẽ có giới hạn. Đề nghị của bạn về cách loại bỏ giới hạn này được hoan nghênh.

Hy vọng bạn thấy bài đăng này hữu ích.

Các vấn đề liên quan