相关STI模型的嵌套表单字段

时间:2014-02-08 17:57:07

标签: ruby-on-rails coffeescript nested-forms single-table-inheritance sti

我有一个模型事件,它有一个Payoption,这是一个STI模型。 Payoption可以是BankPayoption,CashPayoption等,每个都有完全不同的领域。

模型,Payoption只有字符串属性:

class Event < ActiveRecord::Base
    has_one :payoption    
end

class Payoption < ActiveRecord::Base
    belongs_to :event
end

class BankPayoption < Payoption
end

class CashPayoption < Payoption
end

事件控制器:

class EventsController < ApplicationController
    def new

    end
    def create
        @event = Event.new(post_params)
        @event.user_id = current_user.id
        @event.save
        redirect_to @event
    end
    private
        def post_params
            params.require(:event).permit(:title, :text, :code)
        end
end

这是新的事件视图:

<%= form_for :event, url: events_path do |f| %>
  <p>
    <%= f.label :title %><br>
    <%= f.text_field :title %>
  </p>

  <p>
    <%= f.label :text %><br>
    <%= f.text_area :text %>
  </p>

  <p>
    <%= f.label :code %><br>
    <%= f.text_field :code %>
  </p>

  <p>
    <%= f.submit %>
  </p>
<% end %>

此代码工作正常,但显然没有创建Payoption关联,我不知道如何在当前form_for中实现它。我希望能够使用select元素选择Payoption类型,然后显示正确的字段。我知道字段显示/隐藏操作是通过javascript完成的,但真正的问题是,如何创建一个嵌套的表单来创建所选的子类并将其与事件对象相关联?

由于

1 个答案:

答案 0 :(得分:1)

非常简单这样做

class EventsController < ApplicationController
    def new
       @event = Event.new
       @event.build_payoption
    end
end

<%= form_for(@event) do |f| %>
  <p>
    <%= f.label :title %><br>
    <%= f.text_field :title %>
  </p>

  <p>
    <%= f.label :text %><br>
    <%= f.text_area :text %>
  </p>

  <p>
    <%= f.label :code %><br>
    <%= f.text_field :code %>
  </p>
   <%= f.fields_for :payoption do |p| %>
      <%= p.label :payoption_type %>
      <%= p.select(:payoption_type, Payoption::PAY_OPTION , {:prompt => "Select"}, {class: "payoption"}) %>
   <% end %>
  <p>
    <%= f.submit %>
  </p>
<% end %>

class Event < ActiveRecord::Base
    has_one :payoption, dependent: :destroy
    accepts_nested_attributes_for :payoption    
end

class Payoption < ActiveRecord::Base
    belongs_to :event
    PAY_OPTION = ["option1", "option2", "option3"]
end
假设payoption_type是您的Payoption模型中的一个字段