Users
Name |
---|
New User
15.2 Iteration J2: Authenticating Users 14.4 Playtime
51 (tests|runs), 147 assertions, 0 failures, 0 errors. <0> was expected to be >= <1>. Traceback: /home/rubys/git/awdwr/edition4/checkdepot.rb:38:in `assert_test_summary' /home/rubys/git/awdwr/edition4/checkdepot.rb:389:in `block in <class:DepotTest>'
Scaffold the user model
rails generate scaffold User name:string password:digest
invoke active_record
create db/migrate/20170614120704_create_users.rb
create app/models/user.rb
invoke test_unit
create test/models/user_test.rb
create test/fixtures/users.yml
invoke resource_route
route resources :users
invoke scaffold_controller
create app/controllers/users_controller.rb
invoke erb
create app/views/users
create app/views/users/index.html.erb
create app/views/users/edit.html.erb
create app/views/users/show.html.erb
create app/views/users/new.html.erb
create app/views/users/_form.html.erb
invoke test_unit
create test/controllers/users_controller_test.rb
invoke helper
create app/helpers/users_helper.rb
invoke test_unit
invoke jbuilder
create app/views/users/index.json.jbuilder
create app/views/users/show.json.jbuilder
create app/views/users/_user.json.jbuilder
invoke test_unit
create test/system/users_test.rb
invoke assets
invoke coffee
create app/assets/javascripts/users.coffee
invoke scss
create app/assets/stylesheets/users.scss
invoke scss
identical app/assets/stylesheets/scaffolds.scss
uncomment out bcrypt
edit Gemfile
# Use ActiveModel has_secure_password
gem 'bcrypt', '~> 3.1.7'
Run the migration
rails db:migrate
mv 20170614120704_create_users.rb 20170614000009_create_users.rb
== 20170614000009 CreateUsers: migrating ======================================
-- create_table(:users)
-> 0.0006s
== 20170614000009 CreateUsers: migrated (0.0007s) =============================
Add validation, has_secure_password
edit app/models/user.rb
class User < ApplicationRecord
validates :name, presence: true, uniqueness: true
has_secure_password
end
Avoid redirect after create, update operations
edit app/controllers/users_controller.rb
def create
@user = User.new(user_params)
respond_to do |format|
if @user.save
format.html { redirect_to users_url,
notice: "User #{@user.name} was successfully created." }
format.json { render :show, status: :created, location: @user }
else
format.html { render :new }
format.json { render json: @user.errors,
status: :unprocessable_entity }
end
end
end
edit app/controllers/users_controller.rb
def update
respond_to do |format|
if @user.update(user_params)
format.html { redirect_to users_url,
notice: "User #{@user.name} was successfully updated." }
format.json { render :show, status: :ok, location: @user }
else
format.html { render :edit }
format.json { render json: @user.errors,
status: :unprocessable_entity }
end
end
end
Display users sorted by name
edit app/controllers/users_controller.rb
def index
@users = User.order(:name)
end
Update form used to both create and update users
edit app/views/users/_form.html.erb
<div class="depot_form">
<%= form_with(model: user, local: true) do |form| %>
<% if user.errors.any? %>
<div id="error_explanation">
<h2><%= pluralize(user.errors.count, "error") %>
prohibited this user from being saved:</h2>
<ul>
<% user.errors.full_messages.each do |message| %>
<li><%= message %></li>
<% end %>
</ul>
</div>
<% end %>
<fieldset>
<legend>Enter User Details</legend>
<div class="field">
<%= form.label :name, 'Name:' %>
<%= form.text_field :name, id: :user_name, size: 40 %>
</div>
<div class="field">
<%= form.label :password, 'Password:' %>
<%= form.password_field :password, id: :user_password, size: 40 %>
</div>
<div class="field">
<%= form.label :password_confirmation, 'Confirm:' %>
<%= form.password_field :password_confirmation, id: :user_password_confirmation, size: 40 %>
</div>
<div class="actions">
<%= form.submit %>
</div>
</fieldset>
<% end %>
</div>
Demonstrate creating a new user
get /users
get /users/new
post /users
get http://localhost:3000/users
Show how this is stored in the database
sqlite3> select * from users
id = 1
name = dave
password_digest = $2a$10$u.PdElftrOMdOC9.ZgEVjOn.Q8qfAOs33t29ue1mWOhsvPOyGBVXe
created_at = 2017-06-14 12:07:22.857714
updated_at = 2017-06-14 12:07:22.857714
Update tests to reflect the changes in redirection and uniqueness
edit test/controllers/users_controller_test.rb
test "should create user" do
assert_difference('User.count') do
post users_url, params: { user: { name: 'sam',
password: 'secret', password_confirmation: 'secret' } }
end
assert_redirected_to users_url
end
edit test/controllers/users_controller_test.rb
test "should create user" do
assert_difference('User.count') do
post users_url, params: { user: { name: 'sam',
password: 'secret', password_confirmation: 'secret' } }
end
assert_redirected_to users_url
end
Make sure that all test names are unique
edit test/fixtures/users.yml
# Read about fixtures at
# http://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html
one:
name: dave
password_digest: <%= BCrypt::Password.create('secret') %>
two:
name: susannah
password_digest: <%= BCrypt::Password.create('secret') %>
rails test
Run options: --seed 35528
# Running:
..................................................E
Error:
DslUserStoriesTest#test_two_people_buying:
NoMethodError: undefined method `split' for nil:NilClass
app/models/order.rb:36:in `charge!'
app/jobs/charge_order_job.rb:7:in `perform'
app/controllers/orders_controller.rb:42:in `block in create'
app/controllers/orders_controller.rb:36:in `create'
test/integration/dsl_user_stories_test.rb:95:in `checks_out'
test/integration/dsl_user_stories_test.rb:63:in `block in test_two_people_buying'
test/integration/dsl_user_stories_test.rb:54:in `test_two_people_buying'
bin/rails test test/integration/dsl_user_stories_test.rb:53
Finished in 1.980746s, 25.7479 runs/s, 69.1659 assertions/s.
51 runs, 137 assertions, 0 failures, 1 errors, 0 skips