git初始代碼https://github.com/chentianwei411/at-mentions-with-action-textcss
首先,開分支onboardingbar.html
而後,git
rails g scaffold Team user:references name
rails g migration AddTwitterToUsers twitter
rails db:migrate
在user.rb上添加github
has_many :teams
在_navbar.html.erb上添加導航連接:數據庫
<li class="nav-item"><%= link_to "Teams", teams_path, class: "nav-link" %></li>
在用戶註冊app/views/devise/registrations/edit.html.erb上添加twitter field:bootstrap
<div class="form-group"> <%= f.text_field :twitter, class: 'form-control', placeholder: 'Twitter Username' %> </div>
在application_controller.rb上添加參數白名單:數組
protected def configure_permitted_parameters devise_parameter_sanitizer.permit(:sign_up, keys: [:name]) devise_parameter_sanitizer.permit(:account_update, keys: [:name, :twitter]) end
在app/views/home/index.html.erbapp
<% if user_signed_in? %> <div class="progress"> <div class="progress-bar" role="progressbar" style="width: 25%"></div> </div> <%= current_user.twitter? %> <%= current_user.teams.any? %> <% end %>
下一步,user.rb添加方法來判斷onboardingbar的進度:spa
def onboarding_percent steps = [:twitter?, :has_team?] conplete = steps.select{ |step| send(step)} complete.length / steps.length.to_f * 100 end def has_team? teams.any? end # select()方法,篩選返回值爲true的數組項 # Ruby#send()方法,可使用symbol符號方法
# 方法最後返回的值的計算必須使用浮點格式,不能是整數格式。使用to_f。
在views/home/index.html.erb,從bootstrap拷貝下來進度條代碼,並修改👇:code
<% if user_signed_in? %> <div class="progress"> <div class="progress-bar" role="progressbar" style="width: <%= current_user.onboarding_percent %>%"></div> </div> <%= current_user.onboarding_percent %>% <%= current_user.twitter? %> <%= current_user.teams.any? %> <% end %>
這樣進度條就能夠根據數據庫傳來的數據顯示進度了。
下一步是對進度條的說明,即缺哪一項:
使用fontawesome.com的圖標,把鏈接粘貼到<head>內
<link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.8.1/css/all.css" integrity="sha384-50oBUHEmvpQ+1lW4y57PTFmhCaXp0ML5d60M1M7uH2+nqUivzIebhndOJK28anvf" crossorigin="anonymous">
在index.html.erb上加上:
<ul> <li><%= current_user.onboarding_percent %>%</li> <li> <% if current_user.twitter? %> <i class="far fa-check-circle"></i> <% else %> <i class="far fa-window-close"></i> <% end %> Add your Twitter profile </li> <li> <% if current_user.teams.any? %> <i class="far fa-check-circle"></i> <% else %> <i class="far fa-window-close"></i> <% end %> Create a team </li> </ul>
若是:
那麼,能夠用一個helper方法。
index.html.erb
<% if user_signed_in? %> Onboarding <%= current_user.onboarding_percent.round%>% Complete <div class="progress"> <div class="progress-bar" role="progressbar" style="width: <%= current_user.onboarding_percent.round %>%"></div> </div> <div><%= onboarding_step_icon(current_user.twitter?)%> Add your Twitter profile</div> <div><%= onboarding_step_icon(current_user.has_team?)%> Create a team</div> <% end %>
helper方法:
module ApplicationHelper ... def onboarding_step_icon(step_completed) color = step_completed ? "text-success" : "text-muted" tag.i class: ['fas', "fa-check", color] end end
# tag.<tag name>代替了content_tag(name)的寫法
若是:
那麼,就能夠把部分方法放到一個模塊內,讓User類include這個類。
例如:
module UserOnboarding extend ActiveSupport::Corcern def onboarding_percent steps = [:twitter?, :has_team?] complete = steps.select{ |step| send(step)} complete.length / steps.length.to_f * 100 end def has_team? teams.any? end end
而後user.rb內include UserOnboarding