Вопрос

I have a model Event that has one Payoption, which is a STI model. Payoption could be BankPayoption, CashPayoption etc, each of them has totally different fields.

The models, Payoption just have string attributes:

class Event < ActiveRecord::Base
    has_one :payoption    
end

class Payoption < ActiveRecord::Base
    belongs_to :event
end

class BankPayoption < Payoption
end

class CashPayoption < Payoption
end

Event controller:

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

This is the new Event view:

<%= 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 %>

This code works fine but it's obviously not creating a Payoption association, I'm not sure how to implement this in the current form_for. I want to be able to pick on of the Payoption types with a select element and then the correct fields should show. I know the field show/hide action is done by javascript but the real problem is, how do I make a nested form that creates the chosen subclass and associates that with the event object?

Thanks

Это было полезно?

Решение

very simple do it this way

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

m assuming payoption_type is a field in your Payoption model

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top