Skip to content

Commit 19ee304

Browse files
committed
Replace Subclasses with Strategies: Step Thirteen
* Always instantiate the same root class
1 parent a3b36db commit 19ee304

File tree

18 files changed

+68
-36
lines changed

18 files changed

+68
-36
lines changed

example_app/app/controllers/questions_controller.rb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,13 +31,13 @@ def update
3131
private
3232

3333
def build_question
34-
@question = type.constantize.new(question_params)
34+
@question = Question.new(question_params)
3535
@question.build_submittable(type, submittable_params)
3636
@question.survey = @survey
3737
end
3838

3939
def type
40-
params[:question][:type]
40+
params[:question][:submittable_type]
4141
end
4242

4343
def question_params

example_app/app/controllers/types_controller.rb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ class TypesController < ApplicationController
22
def new
33
@question = Question.find(params[:question_id])
44
assign_type
5-
@new_question = type.constantize.new
5+
@new_question = Question.new
66
@new_question.build_submittable(type, {})
77
end
88

@@ -37,6 +37,6 @@ def submittable_attributes
3737
end
3838

3939
def type
40-
params[:question][:type]
40+
params[:question][:submittable_type]
4141
end
4242
end

example_app/app/models/question.rb

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,14 @@
11
class Question < ActiveRecord::Base
22
include ActiveModel::ForbiddenAttributesProtection
33

4-
QUESTION_TYPES = %w(OpenQuestion MultipleChoiceQuestion ScaleQuestion).freeze
4+
QUESTION_TYPES = %w(
5+
OpenSubmittable
6+
MultipleChoiceSubmittable
7+
ScaleSubmittable
8+
).freeze
59

610
validates :submittable, associated: true
7-
validates :type, presence: true, inclusion: QUESTION_TYPES
11+
validates :submittable_type, presence: true, inclusion: QUESTION_TYPES
812
validates :title, presence: true
913

1014
belongs_to :submittable, polymorphic: true
@@ -33,7 +37,7 @@ def summarize(summarizer)
3337
def switch_to(type, new_attributes, submittable_attributes)
3438
attributes = self.attributes.merge(new_attributes)
3539
cloned_attributes = attributes.except('id', 'type', 'submittable_type')
36-
new_question = type.constantize.new(cloned_attributes)
40+
new_question = Question.new(cloned_attributes)
3741
new_question.build_submittable(type, submittable_attributes)
3842
new_question.id = id
3943

example_app/app/views/multiple_choice_questions/_multiple_choice_question.html.erb renamed to example_app/app/views/multiple_choice_submittables/_multiple_choice_submittable.html.erb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
<ol>
2-
<% submittable.options.each do |option| -%>
2+
<% multiple_choice_submittable.options.each do |option| -%>
33
<li>
44
<%= submission_fields.radio_button :text, option.text, id: dom_id(option) %>
55
<%= content_tag :label, option.text, for: dom_id(option) %>

example_app/app/views/multiple_choice_questions/_multiple_choice_question_form.html.erb renamed to example_app/app/views/multiple_choice_submittables/_multiple_choice_submittable_form.html.erb

File renamed without changes.

example_app/app/views/open_questions/_open_question.html.erb renamed to example_app/app/views/open_submittables/_open_submittable.html.erb

File renamed without changes.

example_app/app/views/open_questions/_open_question_form.html.erb renamed to example_app/app/views/open_submittables/_open_submittable_form.html.erb

File renamed without changes.

example_app/app/views/questions/_form.html.erb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
<%= simple_form_for question, as: :question, url: url do |form| -%>
2-
<%= form.hidden_field :type %>
2+
<%= form.hidden_field :submittable_type %>
33
<%= form.input :title %>
44
<%= render(
5-
"#{question.to_partial_path}_form",
5+
"#{question.submittable.to_partial_path}_form",
66
submittable: question.submittable,
77
form: form
88
) %>

example_app/app/views/questions/edit.html.erb

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,20 +5,26 @@
55

66
<%= link_to(
77
'Scale Question',
8-
new_question_type_path(@question, question: { type: 'ScaleQuestion' })
8+
new_question_type_path(
9+
@question,
10+
question: { submittable_type: 'ScaleSubmittable' }
11+
)
912
) %>
1013

1114
<%= link_to(
1215
'Multiple Choice Question',
1316
new_question_type_path(
1417
@question,
15-
question: { type: 'MultipleChoiceQuestion' }
18+
question: { submittable_type: 'MultipleChoiceSubmittable' }
1619
)
1720
) %>
1821

1922
<%= link_to(
2023
'Open Question',
21-
new_question_type_path(@question, question: { type: 'OpenQuestion' })
24+
new_question_type_path(
25+
@question,
26+
question: { submittable_type: 'OpenSubmittable' }
27+
)
2228
) %>
2329
</p>
2430

example_app/app/views/scale_questions/_scale_question.html.erb renamed to example_app/app/views/scale_submittables/_scale_submittable.html.erb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
<ol>
2-
<% submittable.steps.each do |step| -%>
2+
<% scale_submittable.steps.each do |step| -%>
33
<li>
44
<%= submission_fields.radio_button :text, step %>
55
<%= submission_fields.label "text_#{step}", label: step %>

0 commit comments

Comments
 (0)