Skip to content

Commit 04f5009

Browse files
committed
User profile editing
1 parent 7d0fd6c commit 04f5009

7 files changed

Lines changed: 150 additions & 182 deletions

File tree

app/controllers/users_controller.rb

Lines changed: 3 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -2,46 +2,22 @@ class UsersController < ApplicationController
22
skip_before_action :authenticate_user!, only: [:signup, :create]
33
before_action :set_user, only: [:show, :edit, :update, :destroy]
44

5-
# GET /users
6-
# GET /users.json
7-
def index
8-
@users = User.all
9-
end
105

116
# GET /users/1
127
# GET /users/1.json
138
def show
14-
end
15-
16-
# GET /signup
17-
def signup
18-
@user = User.new
9+
authorize! :read, @user
1910
end
2011

2112
# GET /users/1/edit
2213
def edit
23-
end
24-
25-
# POST /users
26-
# POST /users.json
27-
def create
28-
@user = User.new(user_params)
29-
@user.role ||= 'member'
30-
@user.account ||= 'free'
31-
respond_to do |format|
32-
if @user.save
33-
format.html { redirect_to root_path, notice: 'User was successfully created.' }
34-
format.json { render :show, status: :created, location: @user }
35-
else
36-
format.html { render :signup, alert: @user.errors }
37-
format.json { render json: @user.errors, status: :unprocessable_entity }
38-
end
39-
end
14+
authorize! :update, @user
4015
end
4116

4217
# PATCH/PUT /users/1
4318
# PATCH/PUT /users/1.json
4419
def update
20+
authorize! :update, @user
4521
respond_to do |format|
4622
if @user.update(user_params)
4723
format.html { redirect_to @user, notice: 'User was successfully updated.' }
@@ -53,16 +29,6 @@ def update
5329
end
5430
end
5531

56-
# DELETE /users/1
57-
# DELETE /users/1.json
58-
def destroy
59-
@user.destroy
60-
respond_to do |format|
61-
format.html { redirect_to users_url, notice: 'User was successfully destroyed.' }
62-
format.json { head :no_content }
63-
end
64-
end
65-
6632
private
6733
# Use callbacks to share common setup or constraints between actions.
6834
def set_user

app/models/ability.rb

Lines changed: 64 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -1,79 +1,79 @@
11
class Ability
2-
include CanCan::Ability
2+
include CanCan::Ability
33

4-
def initialize(user)
5-
alias_action :new_request, :send_request, to: :request
4+
def initialize(user)
5+
alias_action :new_request, :send_request, to: :request
66

7-
@user = user || User.new
8-
@user.role = 'guest' if @user.role.blank?
7+
@user = user || User.new
8+
@user.role = 'guest' if @user.role.blank?
99

10-
send(@user.role.downcase)
11-
end
10+
send(@user.role.downcase)
11+
end
1212

13-
# Admin user can do anything
14-
def admin
15-
can :manage, :all
16-
end
13+
# Admin user can do anything
14+
def admin
15+
can :manage, :all
16+
end
1717

18-
# Guest, a non-signed in user, can only view public articles
19-
def guest
20-
can :read, Article do |article|
21-
article.private == false || article.private == nil
22-
end
23-
can :read, User
24-
end
18+
# Guest, a non-signed in user, can only view public articles
19+
def guest
20+
can :read, Article do |article|
21+
article.private == false || article.private == nil
22+
end
23+
can :read, User
24+
end
2525

26-
# Member is a registered user
27-
def member
28-
guest
29-
# Member's account type determines his/her abilities
30-
send @user.account.downcase
31-
end
26+
# Member is a registered user
27+
def member
28+
guest
29+
# Member's account type determines his/her abilities
30+
send @user.account.downcase
31+
end
3232

33-
# Types of user account: free, basic, academic, pro and enterprise
33+
# Types of user account: free, basic, academic, pro and enterprise
3434

35-
def free
36-
# Article
37-
cannot :manage, Article, private: true
38-
can :manage, Article do |article|
39-
(article.private == false && article.user_id == @user.id)
40-
end
41-
# Appraisal
42-
can :manage, Appraisal do |appraisal|
43-
appraisal.member.user_id == @user.id
44-
end
45-
# Participation
46-
can :manage, Member, user_id: @user.id
47-
# User
48-
can [:read, :update], User, id: @user.id
49-
end
35+
def free
36+
# Article
37+
cannot :manage, Article, private: true
38+
can :manage, Article do |article|
39+
(article.private == false && article.user_id == @user.id)
40+
end
41+
# Appraisal
42+
can :manage, Appraisal do |appraisal|
43+
appraisal.member.user_id == @user.id
44+
end
45+
# Participation
46+
can :manage, Member, user_id: @user.id
47+
# User
48+
can [:read, :update], User, id: @user.id
49+
end
5050

51-
def basic
52-
free
53-
can :participate_in, Article do |article|
54-
article.members.include? @user
55-
end
56-
can :manage, Article do |article|
57-
(article.user_id == @user.id)
58-
end
59-
end
51+
def basic
52+
free
53+
can :participate_in, Article do |article|
54+
article.members.include? @user
55+
end
56+
can :manage, Article do |article|
57+
(article.user_id == @user.id)
58+
end
59+
end
6060

61-
def academic
62-
basic
61+
def academic
62+
basic
6363

64-
can :create_report, Article do |article|
65-
article.user_id == @user.id
66-
end
67-
can :import_export_excel, Article do |article|
68-
article.user_id == @user.id
69-
end
70-
end
64+
can :create_report, Article do |article|
65+
article.user_id == @user.id
66+
end
67+
can :import_export_excel, Article do |article|
68+
article.user_id == @user.id
69+
end
70+
end
7171

72-
def pro
73-
academic
74-
can :create_report, Article
75-
can :create_pdf_report, Article
76-
can :import_export_excel, Article
77-
end
72+
def pro
73+
academic
74+
can :create_report, Article
75+
can :create_pdf_report, Article
76+
can :import_export_excel, Article
77+
end
7878

7979
end

app/views/users/_form.html.erb

Lines changed: 0 additions & 47 deletions
This file was deleted.

app/views/users/edit.html.slim

Lines changed: 30 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,32 @@
1-
h1 Editing User
1+
- page_title "User Profile"
22

3-
= render 'form', user: @user
3+
- content_for :left_frame do
4+
= render 'users/profile_sidepanel'
5+
6+
#container-box
7+
.widget
8+
.widget-header
9+
i.icon-list-ul
10+
h3 = @user.name
11+
.well.well-widget-content
12+
.widget-content-title Editing user profile
13+
14+
= form_with model: @user do |form|
15+
.control-group
16+
= form.label :name, for: 'user_name', class: "control-label"
17+
.controls
18+
= form.text_field :name, class: 'input-xxlarge'
19+
20+
.control-group
21+
= form.label :bio, class: "control-label"
22+
.controls
23+
= form.text_area :bio, class: 'input-xxlarge tinymce', rows: 10
24+
25+
= tinymce
26+
27+
#toolbar.button-toolbar
28+
= form.submit 'Save', class:"btn btn-primary"
29+
= link_to user_path(@user), class:"btn" do
30+
i.icon-remove
31+
| Cancel
432

app/views/users/index.html.slim

Lines changed: 0 additions & 31 deletions
This file was deleted.

config/routes.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
devise_for :users, controllers: { registrations: 'users/registrations' }
88

99
# Users
10-
resources :users do
10+
resources :users, only: [:show, :edit, :update] do
1111
resources :follows, only: [:index, :create, :destroy]
1212
resources :bookmarks, only: [:index, :create, :destroy]
1313
end
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
require "rails_helper"
2+
3+
RSpec.describe "User Profile", :type => :request do
4+
let(:bingley) { create :bingley }
5+
let(:darcy) { create :darcy }
6+
let(:valid_attributes) {
7+
{ name: "Mr. Bingley", email: "bingley@netherfield.net", bio: '£5,000 a year' }
8+
}
9+
let(:invalid_attributes) {
10+
{ name: "John Doe", email: " " }
11+
}
12+
13+
context "without logged in user" do
14+
it "allows to read a user's profile" do
15+
get user_path(bingley)
16+
expect(response).to redirect_to( new_user_session_path )
17+
end
18+
19+
it "won't allow the user to edit" do
20+
get edit_user_path(bingley)
21+
expect(response).to redirect_to( new_user_session_path )
22+
end
23+
end
24+
25+
context "with logged in user" do
26+
before {
27+
sign_in bingley
28+
}
29+
it "allows to read a user's profile" do
30+
get user_path(darcy)
31+
expect(response.body).to include(bingley.name)
32+
end
33+
34+
it "allows the user to edit" do
35+
get edit_user_path(bingley)
36+
expect(response).to be_successful
37+
end
38+
39+
it "allows the user to edit his bio" do
40+
patch user_path(bingley), params: {user: valid_attributes}
41+
expect(bingley.reload.bio).to eq '£5,000 a year'
42+
end
43+
44+
it "won't allow the user to edit" do
45+
get edit_user_path(darcy)
46+
expect(response).to redirect_to(root_path)
47+
follow_redirect!
48+
expect(response.body).to include('You are not authorized')
49+
end
50+
end
51+
52+
end

0 commit comments

Comments
 (0)