Add contactable to tracks
Added social media fields to track submission form by using a polymorphic association with the Contact Model.
This commit is contained in:
parent
770a63e15c
commit
465976bc60
7 changed files with 31 additions and 3 deletions
|
|
@ -13,12 +13,15 @@ class TracksController < ApplicationController
|
||||||
|
|
||||||
def new
|
def new
|
||||||
@track = @program.tracks.new(color: @conference.next_color_for_collection(:tracks))
|
@track = @program.tracks.new(color: @conference.next_color_for_collection(:tracks))
|
||||||
|
@track.build_contact
|
||||||
end
|
end
|
||||||
|
|
||||||
def edit; end
|
def edit; end
|
||||||
|
|
||||||
def create
|
def create
|
||||||
@track = @program.tracks.new(track_params)
|
@track = @program.tracks.new(track_params)
|
||||||
|
@contact = @track.build_contact(track_params[:contact_attributes])
|
||||||
|
@contact.conference = @conference
|
||||||
@track.submitter = current_user
|
@track.submitter = current_user
|
||||||
@track.cfp_active = false
|
@track.cfp_active = false
|
||||||
if @track.save
|
if @track.save
|
||||||
|
|
@ -35,7 +38,8 @@ class TracksController < ApplicationController
|
||||||
redirect_to conference_program_tracks_path(conference_id: @conference.short_title),
|
redirect_to conference_program_tracks_path(conference_id: @conference.short_title),
|
||||||
notice: 'Track request successfully updated.'
|
notice: 'Track request successfully updated.'
|
||||||
else
|
else
|
||||||
flash.now[:error] = "Track request update failed: #{@track.errors.full_messages.join('. ')}."
|
flash.now[:error] = "Track request update failed: #{@track.errors.full_messages.join('. ')}" \
|
||||||
|
"#{@track.contact.errors.full_messages.join('. ')}."
|
||||||
render :edit
|
render :edit
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
@ -55,7 +59,8 @@ class TracksController < ApplicationController
|
||||||
private
|
private
|
||||||
|
|
||||||
def track_params
|
def track_params
|
||||||
params.require(:track).permit(:name, :description, :color, :short_name, :start_date, :end_date, :relevance)
|
params.require(:track).permit(:name, :description, :color, :short_name, :start_date, :end_date, :relevance,
|
||||||
|
contact_attributes: [:id, :social_tag, :facebook, :googleplus, :twitter, :instagram, :mastodon, :youtube])
|
||||||
end
|
end
|
||||||
|
|
||||||
def update_state(transition, notice)
|
def update_state(transition, notice)
|
||||||
|
|
|
||||||
|
|
@ -4,6 +4,7 @@ class Contact < ApplicationRecord
|
||||||
has_paper_trail on: [:update], ignore: [:updated_at], meta: { conference_id: :conference_id }
|
has_paper_trail on: [:update], ignore: [:updated_at], meta: { conference_id: :conference_id }
|
||||||
|
|
||||||
belongs_to :conference
|
belongs_to :conference
|
||||||
|
belongs_to :contactable, polymorphic: true
|
||||||
|
|
||||||
validates :conference, presence: true
|
validates :conference, presence: true
|
||||||
# Conferences only have one contact
|
# Conferences only have one contact
|
||||||
|
|
|
||||||
|
|
@ -12,6 +12,8 @@ class Track < ApplicationRecord
|
||||||
belongs_to :selected_schedule, class_name: 'Schedule'
|
belongs_to :selected_schedule, class_name: 'Schedule'
|
||||||
has_many :events, dependent: :nullify
|
has_many :events, dependent: :nullify
|
||||||
has_many :schedules
|
has_many :schedules
|
||||||
|
has_one :contact, as: :contactable
|
||||||
|
accepts_nested_attributes_for :contact
|
||||||
|
|
||||||
has_paper_trail ignore: [:updated_at], meta: { conference_id: :conference_id }
|
has_paper_trail ignore: [:updated_at], meta: { conference_id: :conference_id }
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -17,4 +17,15 @@
|
||||||
= f.input :end_date, as: :string, input_html: { id: 'registration-period-end-datepicker', readonly: 'readonly' }
|
= f.input :end_date, as: :string, input_html: { id: 'registration-period-end-datepicker', readonly: 'readonly' }
|
||||||
= f.input :description, input_html: {rows: 2, data: { provide: 'markdown-editable' } }, required: true, hint: "This will be public #{markdown_hint}".html_safe
|
= f.input :description, input_html: {rows: 2, data: { provide: 'markdown-editable' } }, required: true, hint: "This will be public #{markdown_hint}".html_safe
|
||||||
= f.input :relevance, input_html: {rows: 5, data: { provide: 'markdown-editable' } }, required: true, hint: "Please explain here how this track relates to the conference, how you are related to its content and why we should accept it. #{markdown_hint}".html_safe
|
= f.input :relevance, input_html: {rows: 5, data: { provide: 'markdown-editable' } }, required: true, hint: "Please explain here how this track relates to the conference, how you are related to its content and why we should accept it. #{markdown_hint}".html_safe
|
||||||
|
|
||||||
|
= f.inputs name:'Social Media' do
|
||||||
|
= f.semantic_fields_for :contact, @track.contact do |c|
|
||||||
|
= c.input :social_tag, hint: "The hashtag you'll use on Twitter and Google+. Don't include the '#' sign!'", required: false
|
||||||
|
= c.input :facebook, hint: 'This will appear in the social media section as a link to the Facebook.', required: false
|
||||||
|
= c.input :googleplus, label: 'Google+ Url', hint: 'This will appear in the social media section as a link to the Google+ Page of your Track', required: false
|
||||||
|
= c.input :twitter, hint: 'This will appear in the social media section as a link to the Twitter Page of your Track', required: false
|
||||||
|
= c.input :instagram, hint: 'This will appear in the social media section as a link to the Instagram Page of your Track', required: false
|
||||||
|
= c.input :mastodon, hint: 'This will appear in the social media section as a link to the Mastodon Page of your Track', required: false
|
||||||
|
= c.input :youtube, hint: 'This will appear in the social media section as a link to the YouTube channel for your Track.', required: false
|
||||||
|
|
||||||
= f.action :submit, as: :button, button_html: { class: 'btn btn-primary' }
|
= f.action :submit, as: :button, button_html: { class: 'btn btn-primary' }
|
||||||
|
|
|
||||||
6
db/migrate/20190612161235_add_polymorphic_to_contact.rb
Normal file
6
db/migrate/20190612161235_add_polymorphic_to_contact.rb
Normal file
|
|
@ -0,0 +1,6 @@
|
||||||
|
class AddPolymorphicToContact < ActiveRecord::Migration[5.1]
|
||||||
|
def change
|
||||||
|
add_column :contacts, :contactable_type, :string
|
||||||
|
add_column :contacts, :contactable_id, :integer
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
@ -10,7 +10,7 @@
|
||||||
#
|
#
|
||||||
# It's strongly recommended that you check this file into your version control system.
|
# It's strongly recommended that you check this file into your version control system.
|
||||||
|
|
||||||
ActiveRecord::Schema.define(version: 2019_06_03_143107) do
|
ActiveRecord::Schema.define(version: 2019_06_12_161235) do
|
||||||
|
|
||||||
create_table "answers", force: :cascade do |t|
|
create_table "answers", force: :cascade do |t|
|
||||||
t.string "title"
|
t.string "title"
|
||||||
|
|
@ -126,6 +126,8 @@ ActiveRecord::Schema.define(version: 2019_06_03_143107) do
|
||||||
t.string "mastodon"
|
t.string "mastodon"
|
||||||
t.string "youtube"
|
t.string "youtube"
|
||||||
t.string "blog"
|
t.string "blog"
|
||||||
|
t.string "contactable_type"
|
||||||
|
t.integer "contactable_id"
|
||||||
end
|
end
|
||||||
|
|
||||||
create_table "delayed_jobs", force: :cascade do |t|
|
create_table "delayed_jobs", force: :cascade do |t|
|
||||||
|
|
|
||||||
|
|
@ -8,6 +8,7 @@ describe TracksController do
|
||||||
let(:conference) { create(:conference) }
|
let(:conference) { create(:conference) }
|
||||||
let!(:regular_track) { create(:track, program: conference.program) }
|
let!(:regular_track) { create(:track, program: conference.program) }
|
||||||
let!(:self_organized_track) { create(:track, :self_organized, program: conference.program, submitter: user, name: 'My awesome track', color: '#800080') }
|
let!(:self_organized_track) { create(:track, :self_organized, program: conference.program, submitter: user, name: 'My awesome track', color: '#800080') }
|
||||||
|
let!(:contact) { create(:contact, contactable_type: 'Track', contactable_id: self_organized_track.id) }
|
||||||
|
|
||||||
before :each do
|
before :each do
|
||||||
sign_in(user)
|
sign_in(user)
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue