Module: RailsOnboarding::PersonalizationHelper

Defined in:
app/helpers/rails_onboarding/personalization_helper.rb

Overview

Helper methods for personalization features in views

Instance Method Summary collapse

Instance Method Details

#for_user_types(*user_types, user: nil) { ... } ⇒ Object

Render content only for specific user types

Examples:

<%= for_user_types(:business, :enterprise) do %>
  <p>This is only shown to business and enterprise users</p>
<% end %>

Parameters:

  • user_types (Array<Symbol>, Symbol)

    User type(s) to show content for

  • user (Object) (defaults to: nil)

    User object (defaults to current_user)

Yields:

  • Block to render if user type matches



16
17
18
19
20
21
22
23
24
25
26
# File 'app/helpers/rails_onboarding/personalization_helper.rb', line 16

def for_user_types(*user_types, user: nil)
  user ||= current_user if respond_to?(:current_user)
  return unless user

  return unless user.respond_to?(:personalization_type)

  user_type = user.personalization_type
  return unless user_types.map(&:to_sym).include?(user_type.to_sym)

  yield if block_given?
end

#personalized_content(user: nil) {|user_type| ... } ⇒ Object

Render different content based on user type

Examples:

<%= personalized_content do |type| %>
  <% if type == :business %>
    <p>Welcome, business user!</p>
  <% else %>
    <p>Welcome!</p>
  <% end %>
<% end %>

Parameters:

  • user (Object) (defaults to: nil)

    User object (defaults to current_user)

Yields:

  • (user_type)

    Block that receives the user type



41
42
43
44
45
46
47
48
49
# File 'app/helpers/rails_onboarding/personalization_helper.rb', line 41

def personalized_content(user: nil, &block)
  user ||= current_user if respond_to?(:current_user)
  return unless user

  return unless user.respond_to?(:personalization_type)

  user_type = user.personalization_type
  yield(user_type) if block_given?
end

#personalized_cta(action, user: nil) ⇒ String

Get personalized CTA (Call To Action) text

Parameters:

  • action (Symbol, String)

    Action type (:next, :complete, :skip, etc.)

  • user (Object) (defaults to: nil)

    User object (defaults to current_user)

Returns:

  • (String)

    Personalized CTA text



127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
# File 'app/helpers/rails_onboarding/personalization_helper.rb', line 127

def personalized_cta(action, user: nil)
  user ||= current_user if respond_to?(:current_user)

  user_type = user&.respond_to?(:personalization_type) ? user.personalization_type : nil

  cta_map = {
    next: {
      business: "Continue to Business Setup",
      enterprise: "Proceed to Enterprise Configuration",
      individual: "Next Step",
      default: "Continue"
    },
    complete: {
      business: "Launch Your Business Account",
      enterprise: "Activate Enterprise Features",
      individual: "Get Started",
      default: "Complete Setup"
    },
    skip: {
      business: "Skip for Now (You can complete this later in Settings)",
      enterprise: "Configure Later",
      individual: "Skip This Step",
      default: "Skip"
    }
  }

  action_map = cta_map[action.to_sym] || {}
  action_map[user_type&.to_sym] || action_map[:default] || action.to_s.titleize
end

#personalized_message(messages, default: "Welcome", user: nil) ⇒ String

Get a personalized message based on user type

Examples:

<%= personalized_message(
  { business: "Welcome to your business dashboard",
    individual: "Welcome to your personal dashboard" },
  default: "Welcome"
) %>

Parameters:

  • messages (Hash)

    Hash of user_type => message

  • default (String) (defaults to: "Welcome")

    Default message if user type not found

  • user (Object) (defaults to: nil)

    User object (defaults to current_user)

Returns:

  • (String)

    The personalized message



64
65
66
67
68
69
70
71
72
# File 'app/helpers/rails_onboarding/personalization_helper.rb', line 64

def personalized_message(messages, default: "Welcome", user: nil)
  user ||= current_user if respond_to?(:current_user)
  return default unless user

  return default unless user.respond_to?(:personalization_type)

  user_type = user.personalization_type
  messages[user_type.to_sym] || default
end

#personalized_progress_indicator(user: nil) ⇒ String

Render a personalized progress indicator

Parameters:

  • user (Object) (defaults to: nil)

    User object (defaults to current_user)

Returns:

  • (String)

    HTML for progress indicator



91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
# File 'app/helpers/rails_onboarding/personalization_helper.rb', line 91

def personalized_progress_indicator(user: nil)
  user ||= current_user if respond_to?(:current_user)
  return "" unless user

  return "" unless user.respond_to?(:personalized_progress_percentage)

  percentage = user.personalized_progress_percentage
  total_steps = user.respond_to?(:personalized_total_steps) ? user.personalized_total_steps : 0

   :div, class: "personalized-progress" do
    concat((:div, class: "progress-bar") do
      (:div, "", class: "progress-fill", style: "width: #{percentage}%")
    end)
    concat((:div, "#{percentage}% complete (Step #{user.personalized_step_index(user.onboarding_current_step) + 1} of #{total_steps})", class: "progress-text"))
  end
end

#personalized_recommendations(user: nil) ⇒ String

Render personalized recommendations

Parameters:

  • user (Object) (defaults to: nil)

    User object (defaults to current_user)

Returns:

  • (String)

    HTML for recommendations



161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
# File 'app/helpers/rails_onboarding/personalization_helper.rb', line 161

def personalized_recommendations(user: nil)
  user ||= current_user if respond_to?(:current_user)
  return "" unless user

  return "" unless user.respond_to?(:personalized_recommendations)

  recommendations = user.personalized_recommendations
  return "" if recommendations.empty?

   :div, class: "personalized-recommendations" do
    concat((:h3, "Recommended for You"))
    concat((:div, class: "recommendations-list") do
      recommendations.each do |rec|
        concat((:div, class: "recommendation-card") do
          concat((:h4, rec[:title]))
          concat((:p, rec[:description]))
          concat(link_to(rec[:cta] || "Get Started", rec[:url], class: "btn btn-primary")) if rec[:url]
        end)
      end
    end)
  end
end

#personalized_steps(user: nil) ⇒ Array<Hash>

Get personalized steps for the current user

Parameters:

  • user (Object) (defaults to: nil)

    User object (defaults to current_user)

Returns:

  • (Array<Hash>)

    Array of step configurations



78
79
80
81
82
83
84
85
# File 'app/helpers/rails_onboarding/personalization_helper.rb', line 78

def personalized_steps(user: nil)
  user ||= current_user if respond_to?(:current_user)
  return RailsOnboarding.configuration.steps unless user

  return RailsOnboarding.configuration.steps unless user.respond_to?(:personalized_steps)

  user.personalized_steps
end

#show_personalized_feature?(feature_name, user: nil) ⇒ Boolean

Check if a feature should be shown based on personalization

Parameters:

  • feature_name (Symbol, String)

    Feature name

  • user (Object) (defaults to: nil)

    User object (defaults to current_user)

Returns:

  • (Boolean)

    True if feature should be shown



113
114
115
116
117
118
119
120
# File 'app/helpers/rails_onboarding/personalization_helper.rb', line 113

def show_personalized_feature?(feature_name, user: nil)
  user ||= current_user if respond_to?(:current_user)
  return true unless user

  return true unless user.respond_to?(:show_personalized_feature?)

  user.show_personalized_feature?(feature_name)
end