2012-02-20 22 views
5

Tôi có một mô hình không hoạt động mà tôi đang cố tạo một số trường biểu mẫu.Rails 3 và fields_for với đối tượng activemodel (tableless)

Hình thức trông giống như vậy:

= form_for :users, url: users_path do |f| 
    - books.each do |book| 
    = f.fields_for :books, book do |bf| 
     = bf.hidden_field :title, value: book.title 
    = f.submit "Send" 

Những gì tôi đang chờ đợi để được tạo ra cho từng lĩnh vực là một cái gì đó như thế này:

<input name="users[books][][title]" type="hidden" value="Some Book Title"> 
<input name="users[books][][title]" type="hidden" value="Some Book Title"> 
<input name="users[books][][title]" type="hidden" value="Some Book Title"> 

Tuy nhiên, những gì tôi đang thực sự nhận được là

<input name="users[books][title]" type="hidden" value="Some Book Title"> 
<input name="users[books][title]" type="hidden" value="Some Book Title"> 
<input name="users[books][title]" type="hidden" value="Some Book Title"> 

Điều này có nghĩa là khi biểu mẫu được gửi chỉ trường nhập cuối cùng có sẵn dưới dạng trạng thái ưu tiên hai chúng tôi đã bị ghi đè do họ đề cập đến cùng một điều.

Tính năng này hoạt động tốt khi mô hình có phụ trợ bản ghi đang hoạt động nhưng không hoạt động khi tableless.

Mọi đề xuất?

Trả lời

7

Tôi nghĩ rằng bạn cần phải thêm này để bạn mô hình người dùng

def books_attributes= attributes 
    # do something with attributes 
    # probably: 
    # self.books = attributes.map{|k,v|Book.new(v)} 
end 

Và cũng xác định persisted? phương pháp ví dụ Book. Làm cho nó chỉ để trả lại false.

Và thêm f cho fields_for của bạn theo quan điểm:

= f.fields_for :books, book do |bf| 

Tôi hy vọng điều này sẽ làm việc.

0

Welldan97 mang đến một điểm rất quan trọng. Bạn cần phải tiếp tục? phương pháp. Tôi đã nhận được một phương pháp không xác định cho tên mô hình trước đó. Kiểm tra ý chính của tôi. Nó hoạt động, nhưng không hoàn hảo bằng bất kỳ phương tiện nào. https://gist.github.com/2638002

0

Hiện tại, việc này khá khó thực hiện với Rails 3.x. Điều đó sẽ thay đổi với Rails 4 với sự ra đời của ActiveModel::Model sẽ cung cấp tất cả các phương pháp cơ sở cho mô hình của bạn là ActionPack tương thích.

Tuy nhiên cho đến khi Rails 4 được phát hành, một tiêu chuẩn tốt để làm cho mô hình của bạn ActionPack tương thích là chính mô-đun ActionModel::Model. Nó "nên" làm việc với Rails ổn định hiện tại. Check it out

Cách bạn chọn triển khai đây là quyết định của bạn, nhưng tôi có thể chỉ cần tải xuống tệp và ném tệp đó vào thư mục lib của ứng dụng của tôi. Bằng cách đó tôi chỉ có thể bao gồm nó bằng cách sử dụng

class Book 
    include ActiveModel::Model 
end 

Khả năng tương thích biểu mẫu Rails dễ dàng cho mô hình tùy chỉnh.

0

Hãy thử cách này:

f.fields_for 'books[]', book do |bf| 
Các vấn đề liên quan