我有一个模型事件,它有一个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完成的,但真正的问题是,如何创建一个嵌套的表单来创建所选的子类并将其与事件对象相关联?
由于
答案 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模型中的一个字段