- New App generated by my template.rb (github.com/KudosX/template.rb):
- Gemset ruby-2.3.0@rails5.0.0.beta4
- Ruby 2.3.0
- Rails 5.0.0.beta4
rails db:create
to setup postgresql db to get app to work when start rails server
- setup devise
rails g devise:install
- execute steps 1,2,3 and 5 from devise messages in terminal
- create devise model
rails g devise User
- run
rails db:migrate
- add to application_controller just before
end
before_action :authenticate_user!, :except => [:index, :about, :contact, :faq]
rails routes
existing routes
- localhost:3000/users/sign_in
- localhost:3000/users/sign_up
- stop server, run
rails g migration AddColumnsToUsers username
- add
:default => nil
to :username column in migration - then run
rails db:migrate
- add this code to views/devise/registrations/new.html.erb
- add just below
<div class="form-inputs">
<%= f.input :username, required: true, autofocus: true %>
- add this code to devise/registrations/edit.htm.erb
<div class="form-inputs">
<%= f.input :username, required: true, autofocus: true %>
</div>
- add logic to controllers/application_controller.rb just after before_action :authenticate_user!
before_action :configure_permitted_parameters, if: :devise_controller?
protected
def configure_permitted_parameters
devise_parameter_sanitizer.permit(:sign_up, keys: [:username])
end
require "rails_helper"
RSpec.feature "Users can sign up" do
scenario "when providing valid details" do
visit "/"
click_link "Sign up"
fill_in "Email", with: "test@example.com"
fill_in "user_password", with: "password"
fill_in "Password confirmation", with: "password"
click_button "Sign up"
expect(page).to have_content("You have signed up successfully.")
end
end
- run
rspec spec/features/signing_up_spec.rb
- add signup link to views/layouts/_header.html.erb
<nav>
<ul class="nav navbar-nav navbar-left">
<li class="<%= "active" if current_page?("/users/sign_up") %>">
<%= link_to "Sign up", new_user_registration_path %>
</li>
</ul>
</nav>
- run
rspec
to see list of tests to complete
require "rails_helper"
RSpec.feature "Users can sign in" do
let!(:user) { FactoryGirl.create(:user) }
scenario "with valid credentials" do
visit "/"
click_link "Sign in"
fill_in "Email", with: user.email
fill_in "Password", with: "password"
click_button "Sign in"
expect(page).to have_content "Signed in successfully."
expect(page).to have_content "Signed in as #{user.email}"
end
scenario "unless they are archived" do
user.archive
visit "/"
click_link "Sign in"
fill_in "Email", with: user.email
fill_in "Password", with: "password"
click_button "Sign in"
expect(page).to have_content "Your account has been archived."
end
end
- run
rspec spec/features/signing_in_spec.rb
, won't show this again, it will be presumptive - add this to spec/factories/user_factory.rb
FactoryGirl.define do
factory :user do
sequence(:email) { |n| "test#{n}@example.com" }
password "password"
trait :admin do
admin true
end
end
end
- change /layouts/_header.html.erb to look like the following
<nav>
<ul class="nav navbar-nav navbar-left">
<% unless user_signed_in? %>
<li class="<%= "active" if current_page?("/users/sign_up") %>">
<%= link_to "Sign up", new_user_registration_path %>
</li>
<li class="<%= "active" if current_page?("/users/sign_in") %>">
<%= link_to "Sign in", new_user_session_path %>
</li>
<% end %>
<% if user_signed_in? %>
<div class="navbar-left">
<p class="navbar-text">
Signed in as <%= current_user.email %>
</p>
<ul class="nav navbar-nav navbar-left">
<li><%= link_to "Sign out", destroy_user_session_path,
method: :delete %>
</li>
</ul>
</div>
<% end %>
</ul>
</nav>
- add this code to spec/factories/user_factory.rb
FactoryGirl.define do
factory :user do
sequence(:email) { |n| "test#{n}@example.com" }
password "password"
end
end
- already added sign out code in step 9
require "rails_helper"
RSpec.feature "Signed-in users can sign out" do
let!(:user) { FactoryGirl.create(:user) }
before do
login_as(user)
end
scenario do
visit "/"
click_link "Sign out"
expect(page).to have_content "Signed out successfully."
end
end
- add the following code to spec/rails_helper.rb
config.include Warden::Test::Helpers, type: :feature
config.after(type: :feature) { Warden.test_reset! }
- change the code in views/devise/registrations/new.html.erb to add blue Sign up link
<div class="form-actions">
<%= f.button :submit, "Sign up", class: "btn btn-primary" %>
</div>
- change the code to views/devise/sessions/new.html.erb to add blue to Log in link
<div class="form-actions">
<%= f.button :submit, "Log in", class: "btn btn-primary" %>
</div>
- change the code to views/devise/registrations/edit.html.erb to add blue to Update link
<div class="form-actions">
<%= f.button :submit, "Update", class: "btn btn-primary" %>
</div>