2010-02-03 29 views
9

Tôi đã tìm kiếm và thử rất nhiều, nhưng tôi không thể thực hiện được như tôi muốn .. vì vậy đây là vấn đề của tôi.Sử dụng các trường từ mô hình liên kết (has_many) với formtastic trong đường ray

class Moving < ActiveRecord::Base 
    has_many :movingresources, :dependent => :destroy 
    has_many :resources, :through => :movingresources 
end 

class Movingresource < ActiveRecord::Base 
    belongs_to :moving 
    belongs_to :resource 
end 

class Resource < ActiveRecord::Base 
    has_many :movingresources 
    has_many :movings, :through => :movingresources 
end 

Movingresources chứa các trường bổ sung, như quantity. Chúng tôi đang làm việc trên các quan điểm cho 'hóa đơn'. Nhờ formtastic để đơn giản hóa toàn bộ mối quan hệ bằng cách chỉ viết

<%= form.input :workers, :as => :check_boxes %> 

và tôi nhận được danh sách hộp kiểm thật sự tốt đẹp. Nhưng những gì tôi đã không phát hiện ra cho đến nay là: Làm thế nào tôi có thể sử dụng các lĩnh vực bổ sung từ 'di chuyển nguồn', tiếp theo hoặc dưới mỗi hộp kiểm các lĩnh vực mong muốn của tôi từ mô hình đó?

Tôi thấy các cách tiếp cận khác nhau, chủ yếu bằng cách lặp lại theo cách thủ công thông qua một mảng các đối tượng và tạo các biểu mẫu thích hợp, sử dụng: trong phần form.inputs, hay không. Nhưng không có giải pháp nào trong số đó được làm sạch (ví dụ: làm việc cho chế độ xem chỉnh sửa nhưng không phải vì mới vì các đối tượng được yêu cầu không được tạo hoặc tạo và tạo ra chúng gây ra một mớ hỗn độn).

Tôi muốn biết các giải pháp của bạn cho việc này!

Trả lời

8

Được rồi, tôi đã bỏ lỡ cuộc cách mạng của accept_nested_attributes_for, điều này giải thích tại sao nó không thực sự hoạt động.

này đã cho tôi một bước tiến lớn hơn nữa, nhưng tôi nghĩ rằng ở đâu đó tôi vẫn sẽ có một số biến chứng có quan hệ phức tạp của tôi^_^

class Moving < ActiveRecord::Base 
    has_many :movingworkers, :dependent => :destroy 
    has_many :workers, :through => :movingworkers 
    accepts_nested_attributes_for :movingworkers 
end 


<% form.inputs :for => :movingworkers do |movingworker| %> 
    <%= movingworker.inputs :worker, :quantity %> 
<% end %> 
+1

Lưu ý rằng mô hình cơ bản thực tế có thể được truy cập trực tiếp thông qua formbuilder, do đó: 'movingworker.object'. Xem dòng 1244 trong action_view/helpers/form_helper.rb: 'attr_accessor: object_name,: object,: options' –

+0

bạn nói đúng. Nhiều thứ đã thay đổi và tôi đã học được nhiều điều mới mẻ, điều này bây giờ là hiển nhiên đối với tôi nhưng nó phải được đề cập đến. – pduersteler

1

Nếu trường không tồn tại trong chế độ xem mới, bạn chỉ có thể kiểm tra nếu trường mới (new_record?) và trình bày một nhóm trường khác (nếu bạn xếp vào một phần có thể khá sạch sẽ tiếp cận).

+0

nhờ, cậu nói đúng. Nhưng kể từ khi tôi làm việc với đường ray, tôi được sử dụng để đơn giản, do đó tôi yêu cầu các giải pháp khác để chọn yêu thích của tôi. Và tôi cũng nghĩ rằng điều này có thể giúp một số người khác. – pduersteler

4

Formtastic: Tùy chọn label_method có thể giúp đỡ. Ví dụ.

<%= form.input :movingworkers, :label_method => :worker %> 

hoặc

<%= form.input :movingworkers, :label_method => Proc.new { |x| "#{x.worker} #{x.quantity}" } %> 
Các vấn đề liên quan