git初始代码
首先,开分支onboardingbar.
然后,
rails g scaffold Team user:references name rails g migration AddTwitterToUsers twitter rails db:migrate
在user.rb上添加
has_many :teams
在_navbar.html.erb上添加导航链接:
在用户注册app/views/devise/registrations/edit.html.erb上添加twitter field:
<%= f.text_field :twitter, class: 'form-control', placeholder: 'Twitter Username' %>
在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
添加OnboardingBar:
在app/views/home/index.html.erb
<% if user_signed_in? %><%= current_user.twitter? %> <%= current_user.teams.any? %><% end %>
下一步,user.rb添加方法来判断onboardingbar的进度:
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拷贝下来进度条代码,并修改?:
<% if user_signed_in? %><%= current_user.onboarding_percent %>% <%= current_user.twitter? %> <%= current_user.teams.any? %><% end %>
这样进度条就可以根据数据库传来的数据显示进度了。
下一步是对进度条的说明,即缺哪一项:
- 在进度条下使用✅,❌图标和说明文字。
使用fontawesome.com的图标,把连接粘贴到<head>内
在index.html.erb上加上:
- <%= current_user.onboarding_percent %>%
- <% if current_user.twitter? %> <% else %> <% end %> Add your Twitter profile
- <% if current_user.teams.any? %> <% else %> <% end %> Create a team
重构:
上面的代码可以重构:使用helper
如果:
- index内的代码太多
- onboarding功能的代码反复使用
那么,可以用一个helper方法。
index.html.erb
<% if user_signed_in? %> Onboarding <%= current_user.onboarding_percent.round%>% Complete<%= onboarding_step_icon(current_user.twitter?)%> Add your Twitter profile<%= onboarding_step_icon(current_user.has_team?)%> Create a team<% end %>
helper方法:
module ApplicationHelper... def onboarding_step_icon(step_completed) color = step_completed ? "text-success" : "text-muted" tag.i class: ['fas', "fa-check", color] endend # tag.代替了content_tag(name)的写法
user.rb中的user类内的实例方法的重构,
如果:
- 方法非常多,不方便区分。
- 很多方法只用于某一个功能。
那么,就可以把部分方法放到一个模块内,让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? endend
然后user.rb内include UserOnboarding