最終的にRails 4.xで動作するようになりました。これは Dmitry/ScotterC の回答に基づいているため、+1 します。
ステップ 1.まず、ポリモーフィック アソシエーションを含む完全なモデルを次に示します。
# 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
はい、それは本当に新しいことではありません。しかし、どこpolymorph_type
から来て、その値はどのように設定されているのでしょうか? ポリモーフィックな関連付けによってテーブル<association_name>_id
に列が追加されるため、これは基になるデータベース レコードの一部です。<association_name>_type
現状では、build_associable
実行時_type
の の値はnil
です。
STEP 2. 子型を渡して受け入れる
フォーム ビューにchild_type
、典型的なフォーム データと共に を送信させます。コントローラーは、強力なパラメーター チェックでそれを許可する必要があります。
# 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
もちろん、ビューは「関連付け可能な」さまざまなタイプのモデルを処理する必要がありますが、これはその 1 つを示しています。
これが誰かを助けることを願っています。(とにかく多形ニワトリが必要なのはなぜですか?)