2011-11-25 21 views
9

Tôi gặp sự cố khi nhận được fields_for để làm việc trên thuộc tính Array của mô hình không phải ActiveRecord.form_for mô hình phi AR - fields_for Thuộc tính mảng không lặp

cất xuống, tôi phải như sau:

mô hình/parent.rb

class Parent 
    extend ActiveModel::Naming 
    include ActiveModel::Conversion 
    include ActiveModel::Validations 
    extend ActiveModel::Translation 

    attr_accessor :bars 
end 

controllers/parent_controller.rb

def new_parent 
    @parent = Parent.new 

    @parent.bars = ["hello", "world"] 
    render 'new_parent' 
end 

views/new_parent.html.haml

= form_for @parent, :url => new_parent_path do |f| 
    = f.fields_for :bars, @parent.bars do |r| 
    = r.object.inspect 

Với mã như trên, trang của tôi chứa ["hello", "world"] - tức là kết quả của inspect được gọi trên Mảng được gán cho bars. (Với @parent.bars bị bỏ qua từ dòng fields_for, tôi chỉ nhận được nil được hiển thị).

Làm cách nào để có thể thực hiện fields_for hoạt động như đối với liên kết AR - tức là, thực hiện mã trong khối một lần cho mỗi thành viên trong mảng bars của tôi?

+0

Cảm ơn vì điều này.Tôi không nghĩ rằng bất cứ ai khác đã cố gắng làm điều này! Cảm ơn ... rất nhiều! – Nitrodist

Trả lời

11

Tôi nghĩ rằng kỹ thuật chính xác là:

= form_for @parent, :url => new_parent_path do |f| 
    - @parent.bars.each do |bar| 
    = f.fields_for "bars[]", bar do |r| 
     = r.object.inspect 

Khá lý do tại sao nó không thể được thực hiện để làm việc Chỉ cần tôi không chắc chắn, nhưng điều này dường như làm các trick.

1

Tôi nghĩ rằng nó có thể được thực hiện mà không cần mỗi:

= form_for @parent, :url => new_parent_path do |f| 
    = f.fields_for :bars do |r| 
    = r.object.inspect 

Bạn cần phải thiết lập một số phương pháp được dự kiến ​​trong tầng lớp phụ huynh để xác định các bộ sưu tập.

class Parent 
    def bars_attributes= attributes 
    end 
end 

Và bạn cũng sẽ cần phải đảm bảo rằng các đối tượng trong mảng ứng phó với tồn (do đó bạn không thể sử dụng dây) :(

0

Tôi đã bỏ các fields_for và thêm nhiều: true

= form_for @parent, :url => new_parent_path do |f| 
    - @parent.bars.each_with_index do |bar, i| 
    = f.text_field :bars, value: bar, multiple: true, id: "bar#{i}" 
Các vấn đề liên quan