tôi cuối cùng bị này để làm việc với Rails 4.x. Điều này dựa trên câu trả lời của Dmitry/ScotterC, vì vậy +1 cho họ.
BƯỚC 1. Để bắt đầu, đây là mô hình đầy đủ với hiệp hội đa hình:
# app/models/polymorph.rb
class Polymorph < ActiveRecord::Base
belongs_to :associable, polymorphic: true
accepts_nested_attributes_for :associable
def build_associable(params)
self.associable = associable_type.constantize.new(params)
end
end
# For the sake of example:
# app/models/chicken.rb
class Chicken < ActiveRecord::Base
has_many: :polymorphs, as: :associable
end
Vâng, đó là không có gì thực sự mới. Tuy nhiên bạn có thể tự hỏi, đâu là polymorph_type
đến từ đâu và giá trị của nó được đặt như thế nào? Đó là một phần của bản ghi cơ sở dữ liệu bên dưới vì các liên kết đa hình thêm các cột <association_name>_id
và <association_name>_type
vào bảng. Khi nó đứng, khi build_associable
thực thi, giá trị của _type
là nil
.
BƯỚC 2. đèo trong và chấp nhận Type Child
Có xem mẫu của bạn gửi child_type
cùng với các dữ liệu mẫu điển hình, và điều khiển của bạn phải cho phép nó trong thông số mạnh mẽ của nó kiểm tra.
# app/views/polymorph/_form.html.erb
<%= form_for(@polymorph) do |form| %>
# Pass in the child_type - This one has been turned into a chicken!
<%= form.hidden_field(:polymorph_type, value: 'Chicken' %>
...
# Form values for Chicken
<%= form.fields_for(:chicken) do |chicken_form| %>
<%= chicken_form.text_field(:hunger_level) %>
<%= chicken_form.text_field(:poop_level) %>
...etc...
<% end %>
<% end %>
# app/controllers/polymorph_controllers.erb
...
private
def polymorph_params
params.require(:polymorph).permit(:id, :polymorph_id, :polymorph_type)
end
Tất nhiên, (các) chế độ xem của bạn sẽ cần xử lý các loại mô hình khác nhau, nhưng điều này thể hiện.
Hy vọng điều này sẽ giúp ai đó ở ngoài đó.(Tại sao bạn lại cần gà đa hình?)
Bạn đã xem bản tin về các hình thức phức tạp chưa? http://railscasts.com/episodes/75-complex-forms-part-3 –
Có, tôi đã tự giải pháp của riêng mình. – dombesz