2013-12-18 15 views
9

Có cách nào để hiển thị liên kết đa hình trong chế độ xem simple_form không?Hiệp hội đa hình trong Simpleform

Cho đến nay tôi đã có dưới đây:

= simple_form_for(@chat, :html => { :class => "form-horizontal" }, :wrapper => "horizontal", defaults: { :input_html => { class: "form-control"}, label_html: { class: "col-lg-4" } }) do |f| 
    = f.error_notification 

    .form-inputs 
     = f.association :from_user 
     = f.association :to_user 
     = f.input :message 
     = f.association :chattable 

    .form-actions 
     = f.button :submit 

Và dưới đây mô hình:

class Chat < ActiveRecord::Base 
    belongs_to :from_user, :foreign_key => 'from_user_id', class_name: 'User' 
    belongs_to :to_user, :foreign_key => 'to_user_id', class_name: 'User' 
    belongs_to :chattable, polymorphic: true 

    validates :from_user, associated: true, presence: true 
    validates :message, presence: true 
end 

này ném ra dưới đây lỗi:

uninitialized constant Chat::Chattable 
+0

Điều này có vẻ như có thể là sự cố bao gồm. Bạn có thể cho chúng tôi thấy mô hình Có thể thích được không? – Narfanator

+0

Tôi không có mô hình 'chattable'. It's 'polymorphic' và nó là một phần của bảng' chats' –

+0

Đợi đã. Ứng dụng của bạn có tên là "Trò chuyện" cũng như mô hình của bạn không? Đó có thể là vấn đề của bạn. Hãy thử đổi tên lớp 'Trò chuyện' và sau đó là' set_table_name "trò chuyện" '. – Narfanator

Trả lời

5

Qua nhiều hem, hawing, và qua lại, chúng tôi đã xác định rằng SimpleForm không làm điều này.

Đây là lý do! (Vâng, có thể là lý do tại sao)

SimpleForm cần phải tìm ra lớp kết hợp. Vì trường hợp mặc định là tên liên kết là tên không được viết hoa của lớp, nó kết thúc bằng việc tìm kiếm lớp "Có thể truy cập" và không tìm thấy nó, đó là lỗi của bạn.

Tin vui là tất cả những gì bạn cần làm là thay thế đường dây f.association :chattable bằng thứ gì đó thực hiện những gì bạn cần. http://guides.rubyonrails.org/form_helpers.html#making-select-boxes-with-ease có thông tin bạn cần để thực hiện "cách dễ dàng" này - hay còn gọi là người trợ giúp biểu mẫu Rails.

Đề xuất của tôi là có hộp chọn cho chattable_type và một số JS bỏ ẩn HTML cho hộp lựa chọn loại đó. Vì vậy, bạn sẽ nhận được một cái gì đó như

= select_tag(:chattable_type, ["Booth", "Venue"]) 

= collection_for_select(:chattable_id, Booth.all) 
= collection_for_select(:chattable_id, Venue.all) 
... 

không bao gồm JS và CSS. Kiểm tra các tài liệu được liên kết ở trên để biết cú pháp thực tế; Tôi nghĩ rằng tôi là một chút đi.

+0

Cảm ơn bạn rất nhiều về điều này và tất cả sự trợ giúp của bạn !!!! –

+2

Không sao cả! Giải quyết vấn đề là công cụ thú vị và bây giờ tôi biết nhiều hơn về cách Rails hoạt động. – Narfanator

7

Tôi tìm thấy giải pháp khác không yêu cầu thao tác JS và vẫn có thể sử dụng đầu vào biểu mẫu đơn giản. Bạn có thể sử dụng lựa chọn đầu vào có id và loại được phân tách bằng dấu phẩy được chuyển làm giá trị tùy chọn.

= f.input :chattable, collection: @chat.chattables, selected: f.object.chattable.try(:signature), 

Sau đó, trong mô hình trò chuyện:

def chattables 
    PolymorphicModel.your_condition.map {|t| [t.name, t.signature] } 
    end 

    def chattable=(attribute) 
    self.chattable_id, self.chattable_type = attribute.split(',') 
    end 

Và trong PylymorphicModel bạn

def signature 
    [id, type].join(",") 
    end 

Hãy nhớ thêm chattable để params bảo đảm nếu bạn sử dụng chúng.

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