From 6a9e6f2d9efbf7952cb612029a0c1fd579c5dadf Mon Sep 17 00:00:00 2001 From: shubham Date: Wed, 13 Mar 2019 16:48:40 +0530 Subject: [PATCH 01/17] ui added for home page --- .rvmrc | 1 + app/assets/images/logo.jpg | Bin 0 -> 63123 bytes app/controllers/home_controller.rb | 4 +++ app/views/home/_user.html.erb | 2 +- app/views/home/index.html.erb | 37 +++++++++++++++++++------ app/views/home/search.js.erb | 2 +- app/views/home/show.html.erb | 0 app/views/layouts/application.html.erb | 11 ++++++-- app/views/welcome/sign_in.html.erb | 2 ++ config/routes.rb | 1 + db/schema.rb | 22 --------------- 11 files changed, 47 insertions(+), 35 deletions(-) create mode 100644 .rvmrc create mode 100644 app/assets/images/logo.jpg create mode 100644 app/views/home/show.html.erb diff --git a/.rvmrc b/.rvmrc new file mode 100644 index 0000000..1399176 --- /dev/null +++ b/.rvmrc @@ -0,0 +1 @@ +rvm use ruby 2.6.0@rails_app diff --git a/app/assets/images/logo.jpg b/app/assets/images/logo.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b35ab84ec0ad7f4127cccd3dbd2dd27f16ad7827 GIT binary patch literal 63123 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�+t{Rx#xcNjq< z=xJ17o@vZW6OIX{k)FI&a<+q=wWyfw!JuG_Q?k5{02F}W<8Z}07<)i?$Rpa0SYtd7 zT5)bp4tr714k=qrNR>1K#RKO)^sVp5(v^5T9@On(T$@+8z)n4B$~P09GfDnE zY0H3ePg-(U1uN8!^Y%}%diZo@es9Mh2X&orHWlyU*V`U-Zq?br)*&~Zt)p47hC&#fyF!Q!5X zhPBjTCpga(V;pijQje5-deBK@$0CH7U0h=mpI>@1N$0P%JKTO$sw&&ibMDZJyS z<4-+(X)~X~r48wzq#WXg2Q;DZI#L(lR4bC*#3bi|L0UyVrxX!^?dw`1ZiL9qI1V$; zDY^Eg3_;FmwE6|W_u`P`{V8_?&w4{bCEcMzb4@3odNOfJ2{`qoVAL{mK|E5i&uU>N zl2<9{0OT4&lS)qj(gTt7s#+oh1393KaZbm6l+t*odxJt}lSkJyV~=x3@bgvB$vteq z98!{arsov7$<0ee-Pj8dDF#W&G^eLZ2*m@xb49*mfCx0@1aa-u)SEdT)VKiTk80_; ztXC_$8jLal9Qul{du(Tjs^cS}HEgI*4KyPhcFktek-TbInYv}fIwkWx_L&{{3UzsrZ)u(rflk;tK)7 z@K4=|kNq|8Ucm?a65rvQczPR85#MW?j9V*HZQpJAb2z z8}cbl<0{v8#7CO{0QUFbal9+0tx58qU3ka-2^FNi=kUM8o4alaSaq#2We5HT6RH0I z$7{sASN{M6y7-%;NSQwkB4s6SH+(X^*uk-U6eZj#M`#0e4_$V*Hj~6-x@sZH37-!1X?4`9U{{RC4)BgY;uU3mx_;2x=#}Qq4 zTgMj6I&ZbqIP}5XN9jrB)GBLAf0O?JBGzGAAH;|0{%7DuIO#_juiBp&{=y#vd|Fwq zJP&E4TsBXerB5x1&$26Q{{Y8p!@Onx00gJ-Mb_r<_lz~o8QUdey^b5m$EQIXWAQbF zvWnkgN&X+#-ftYzm)cDqnHdzI*V%q8{{Vto{7KR`zJ;#%f5cI*L^8=~Df}Hu{{Z9F z;+`!1kbW`vEV&MF?g8u%tgOi_)V#3IH=A~H)?^RUPsB1Qk>U9}y9~>H;8=9mZrbji4N2N}odN(;0 zdKvI>SxES+G0V?d=bTS#4_}nswz$9*qaE2%*170rD~xkjW1rOGxMxiI{3bP}WX)Y4 zP`)?Q{iAQ$zvZ6Zzm0XadXC}%t|s2&10dFowfRf{MQ~Q6r>&2$%5xcEqN3*Bx7W<+ z{83=OBk=vjxC75o=0tzm9lsu*jd+6sWZ8@n>)O4N!%!fOc+P8q@z#+LZOG?}2*C9B zud7Q<55T>%>M(M{IQ(cC-RtzH?A!)%ibA_bWAvt)>SHRMP{IiG>q=JubCFUqfCd1~ zAjdi6VvW_&&+R3!#$R5-mlz!f=Sl_-Tx3#_fB+$|J!**OZ$dr1bjRaL1t=Z)$GtAh zjNlqgBqcUCk&*{W2ntEgbJ~|4xXGY#jP$0NBX}dA{3%HG~hK zk4k9gInI4eEg7BKW4SrOI6aLH003l>PEf{?hZy5E8@&g+8IlK1X@PKlwILg^$Oe-b z-~cdt)|N?X3vq*Q`_bsbJM*c=ZsV@GMlyRC{Q|nwBDyQ^#haF@us(4qwt|Mb3b{B z)2JAv!5sSfQ?Z7}wKN=a*0mMg><2!Xpyftsz-Ol>nnpdUS74GDBposM)A$^Y{;Ob}@=A{?JJm=z^{wB5K+Ir`JolR@i)(x&fX zx{N<5;Bkrp#RLo!O;An%=~`OoS9cwgpX*7CbJm;`g~c_Lj+H5^*#lwD?DeG_1H~eb zd{NXNY8|g(tF#yx2R!GcAtanpfD~hzQ5h#ZQ%xdn?VtgJ$TZ!*HfiigIP{=`*zNC9 znJM2vn9n^usOP0QhDRMKqa%(guW+z2!0AGclroTcpqz9ZQP59u9dHjc-ay4Yg)q~O zfbY16pv@fPG^KMu1PU&IYi5@{sL7)onl!MVVF=CzCQ15JvCe55rfJ^#8S=HO5R8tL zFI>@zTpwBrPpHu3`%;QF^U{(YuVDUEJ0 zsKCZY<4tk9kJgGRqqy2lj%6w^54}O;tI9F~KBQ4aYkkE(j>kcz_`_e(&_iLZ>K2iA zi7sEuKU5^C{6$$FF>CO{QqeRmSP}C*#+s1J{{Vk2{I)0DnkcG`S@PQY8bv29O4FYQ zU8k9I;rs0~lb6!v1Z`-shZ9?8Xp|~imTcyIE`|KL|cjG_o;qbpx zNhXKEwi;~5C(P4#TOY{?U(8WOefC#IoodmASgA$ydat?Ye6A+7N>FmACZCpv$9^#Q z4Wn62G1G4@?bS1cl!qVC*Oco15T8kG8;Io|xFFF*eYX&BhD98*Sh!)7X1b=*`;$xX zIyh@M$Kq$nTC0-tx94k^j)o`N*eBYNTO+*`SMpU%ink2LiYuB(_ptMo z_cZM8*>Ux!_=Yvq^jSj;G(*fndwS7Da(p!+*K_JG?XXp;RMsvs)8u*XGOB%fqi<23 zlu=)49V4Oq#W5HK1B}oYamEHc=%R$nOWXmCy(w|H@Nj6Nt~(r(e(oa2 zqKb~DokM0u802P<4aKp=6jXI3?k3EG(wA;f8Yrz%7kt(m<@225=}Uk($;A{>+|i^V z1CGC)E;kRGk%}m(Vic+Qa(-UIo3tL(QCi1gJ<#DEPhOnTH*E7o6)bWUV#=O+P&wey zMJ>??YaO9Sb51N*8T}}tsin#&>h&MD2kXDb0?f?$H^ifNxGUx}AJv}K%>5jBfQ!UGax)81a=jlK@m+_*CZ(+5dhk|?e zrm+|XiYbw>pz}fFxy=+*F*d^|b~DzHs2JzkiYT!(*b&L^jw!3t8KR2OY#m2(PtuT~ z&m?n26&+0Dt;7q00HK$h1BxiBCA|QTn-qW(o|I8d>@K$qXMx2a2aZNPD590L8rDEp zukxWl^yx(vUu3@GoPY-u)0!x#NEn0A((UIIQB}~CHyAwyE^(gUN+_ho7pSSzJ$|$> z$F69iq3%o2Htq!acBX%xD59we>@GX?rjd^HQB4loCLuYYho=-#Oc)+1Gr|6JQ9vP} qW|Z;AYAB(D8t2lEqKYcIA}%fk9Vnupn2jWZ>q(QED6Il}qyO0lkhz@z literal 0 HcmV?d00001 diff --git a/app/controllers/home_controller.rb b/app/controllers/home_controller.rb index 89b351c..ac21ece 100644 --- a/app/controllers/home_controller.rb +++ b/app/controllers/home_controller.rb @@ -16,4 +16,8 @@ def search end end + def show + @user = User.find_by_id(params[:user_id]) + end + end diff --git a/app/views/home/_user.html.erb b/app/views/home/_user.html.erb index e9f38f3..da849e1 100644 --- a/app/views/home/_user.html.erb +++ b/app/views/home/_user.html.erb @@ -1,3 +1,3 @@
  • - <%= user.first_name %> <%= user.last_name %> + <%= link_to "#{user.first_name} #{user.last_name}", home_show_path %>
  • \ No newline at end of file diff --git a/app/views/home/index.html.erb b/app/views/home/index.html.erb index 99bb73f..1e499c2 100644 --- a/app/views/home/index.html.erb +++ b/app/views/home/index.html.erb @@ -1,10 +1,31 @@ + -

    <%= current_user.email %>

    - -

    -<%= link_to 'Log out', destroy_user_session_path, method: :delete %> -

    - + +
    <%= form_with url: home_search_path, method: :get do |form| %> <%= form.text_field :friend %> @@ -13,7 +34,7 @@

    -
      +
        @@ -32,7 +53,7 @@
        -
        +
        <% @posts.each do |post| %>
      • <%= render(partial: 'post', :locals => {:post => post}) %> diff --git a/app/views/home/search.js.erb b/app/views/home/search.js.erb index 143969a..21f8138 100644 --- a/app/views/home/search.js.erb +++ b/app/views/home/search.js.erb @@ -1 +1 @@ -$("#main").html("<%= j render(partial: 'user', collection: @users, as: :user) %>"); \ No newline at end of file +$("#body").html("<%= j render(partial: 'user', collection: @users, as: :user) %>"); \ No newline at end of file diff --git a/app/views/home/show.html.erb b/app/views/home/show.html.erb new file mode 100644 index 0000000..e69de29 diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb index d2496f6..5e46e26 100644 --- a/app/views/layouts/application.html.erb +++ b/app/views/layouts/application.html.erb @@ -7,12 +7,17 @@ <%= stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track': 'reload' %> <%= javascript_include_tag 'application', 'data-turbolinks-track': 'reload' %> + + -

        <%= notice %>

        -

        <%= alert %>

        - + <%= yield %> diff --git a/app/views/welcome/sign_in.html.erb b/app/views/welcome/sign_in.html.erb index a1d9665..7bfb2d1 100644 --- a/app/views/welcome/sign_in.html.erb +++ b/app/views/welcome/sign_in.html.erb @@ -21,4 +21,6 @@
        <%= f.submit "Log in" %>
        + + <%= link_to 'Sign Up', welcome_sign_up_path %> <% end %> \ No newline at end of file diff --git a/config/routes.rb b/config/routes.rb index 50b0e3a..d459ece 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -1,5 +1,6 @@ Rails.application.routes.draw do get 'home/index' + get 'home/show' get 'welcome/sign_in' get 'welcome/sign_up' get 'home/search' diff --git a/db/schema.rb b/db/schema.rb index ccf9b95..17dd258 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -15,22 +15,6 @@ # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" - create_table "account_histories", force: :cascade do |t| - t.bigint "account_id" - t.integer "credit_rating" - t.datetime "created_at", null: false - t.datetime "updated_at", null: false - t.index ["account_id"], name: "index_account_histories_on_account_id" - end - - create_table "accounts", force: :cascade do |t| - t.bigint "supplier_id" - t.string "account_number" - t.datetime "created_at", null: false - t.datetime "updated_at", null: false - t.index ["supplier_id"], name: "index_accounts_on_supplier_id" - end - create_table "active_storage_attachments", force: :cascade do |t| t.string "name", null: false t.string "record_type", null: false @@ -80,12 +64,6 @@ t.integer "user_id" end - create_table "suppliers", force: :cascade do |t| - t.string "name" - t.datetime "created_at", null: false - t.datetime "updated_at", null: false - end - create_table "users", force: :cascade do |t| t.string "email", default: "", null: false t.string "encrypted_password", default: "", null: false From 664d59ec2890a7d8aef0ad61a20c47fad39d0bf2 Mon Sep 17 00:00:00 2001 From: shubham Date: Wed, 13 Mar 2019 21:43:35 +0530 Subject: [PATCH 02/17] implemented friendship and changed root_path to timeline --- app/assets/javascripts/friendships.coffee | 3 + app/assets/stylesheets/friendships.scss | 3 + app/controllers/friendships_controller.rb | 20 ++++++ app/controllers/home_controller.rb | 9 ++- app/controllers/registrations_controller.rb | 8 --- .../users/confirmations_controller.rb | 30 +++++++++ .../users/omniauth_callbacks_controller.rb | 30 +++++++++ app/controllers/users/passwords_controller.rb | 34 ++++++++++ .../users/registrations_controller.rb | 62 +++++++++++++++++ app/controllers/users/sessions_controller.rb | 27 ++++++++ app/controllers/users/unlocks_controller.rb | 30 +++++++++ app/helpers/friendships_helper.rb | 2 + app/models/friendship.rb | 4 ++ app/models/user.rb | 12 +++- app/views/home/_user.html.erb | 5 ++ app/views/home/friends.html.erb | 42 ++++++++++++ app/views/home/index.html.erb | 55 ++++----------- app/views/home/show.html.erb | 67 +++++++++++++++++++ config/routes.rb | 2 + .../20190313115322_create_friendships.rb | 10 +++ db/schema.rb | 9 ++- .../friendships_controller_test.rb | 7 ++ test/fixtures/friendships.yml | 9 +++ test/models/friendship_test.rb | 7 ++ 24 files changed, 432 insertions(+), 55 deletions(-) create mode 100644 app/assets/javascripts/friendships.coffee create mode 100644 app/assets/stylesheets/friendships.scss create mode 100644 app/controllers/friendships_controller.rb delete mode 100644 app/controllers/registrations_controller.rb create mode 100644 app/controllers/users/confirmations_controller.rb create mode 100644 app/controllers/users/omniauth_callbacks_controller.rb create mode 100644 app/controllers/users/passwords_controller.rb create mode 100644 app/controllers/users/registrations_controller.rb create mode 100644 app/controllers/users/sessions_controller.rb create mode 100644 app/controllers/users/unlocks_controller.rb create mode 100644 app/helpers/friendships_helper.rb create mode 100644 app/models/friendship.rb create mode 100644 app/views/home/friends.html.erb create mode 100644 db/migrate/20190313115322_create_friendships.rb create mode 100644 test/controllers/friendships_controller_test.rb create mode 100644 test/fixtures/friendships.yml create mode 100644 test/models/friendship_test.rb diff --git a/app/assets/javascripts/friendships.coffee b/app/assets/javascripts/friendships.coffee new file mode 100644 index 0000000..24f83d1 --- /dev/null +++ b/app/assets/javascripts/friendships.coffee @@ -0,0 +1,3 @@ +# Place all the behaviors and hooks related to the matching controller here. +# All this logic will automatically be available in application.js. +# You can use CoffeeScript in this file: http://coffeescript.org/ diff --git a/app/assets/stylesheets/friendships.scss b/app/assets/stylesheets/friendships.scss new file mode 100644 index 0000000..8c5a6c8 --- /dev/null +++ b/app/assets/stylesheets/friendships.scss @@ -0,0 +1,3 @@ +// Place all the styles related to the friendships controller here. +// They will automatically be included in application.css. +// You can use Sass (SCSS) here: http://sass-lang.com/ diff --git a/app/controllers/friendships_controller.rb b/app/controllers/friendships_controller.rb new file mode 100644 index 0000000..b44e874 --- /dev/null +++ b/app/controllers/friendships_controller.rb @@ -0,0 +1,20 @@ +class FriendshipsController < ApplicationController + before_action :authenticate_user! + + def create + @friendship = current_user.friendships.build(friend_id: params[:friend_id]) + if @friendship.save + redirect_to root_url + else + flash[:notice] = "Unable to add friend." + redirect_to root_url + end + end + + def destroy + @friendship = current_user.friendships.find_by_id(params[:id]) + @friendship.destroy + redirect_to root_url + end + +end diff --git a/app/controllers/home_controller.rb b/app/controllers/home_controller.rb index ac21ece..55849c1 100644 --- a/app/controllers/home_controller.rb +++ b/app/controllers/home_controller.rb @@ -1,9 +1,7 @@ class HomeController < ApplicationController def index - if user_signed_in? - @posts = current_user.posts - else + if !(user_signed_in?) redirect_to welcome_sign_in_path end end @@ -16,6 +14,11 @@ def search end end + def friends + @friends = current_user.friends + @friends = @friends + (current_user.inverse_friends) + end + def show @user = User.find_by_id(params[:user_id]) end diff --git a/app/controllers/registrations_controller.rb b/app/controllers/registrations_controller.rb deleted file mode 100644 index 036bce1..0000000 --- a/app/controllers/registrations_controller.rb +++ /dev/null @@ -1,8 +0,0 @@ -class RegistrationsController < Devise::RegistrationsController - protected - - def after_sign_up_path_for(resource) - 'welcome/sign_in' # Or :prefix_to_your_route - end - -end diff --git a/app/controllers/users/confirmations_controller.rb b/app/controllers/users/confirmations_controller.rb new file mode 100644 index 0000000..fa535c0 --- /dev/null +++ b/app/controllers/users/confirmations_controller.rb @@ -0,0 +1,30 @@ +# frozen_string_literal: true + +class Users::ConfirmationsController < Devise::ConfirmationsController + # GET /resource/confirmation/new + # def new + # super + # end + + # POST /resource/confirmation + # def create + # super + # end + + # GET /resource/confirmation?confirmation_token=abcdef + # def show + # super + # end + + # protected + + # The path used after resending confirmation instructions. + # def after_resending_confirmation_instructions_path_for(resource_name) + # super(resource_name) + # end + + # The path used after confirmation. + # def after_confirmation_path_for(resource_name, resource) + # super(resource_name, resource) + # end +end diff --git a/app/controllers/users/omniauth_callbacks_controller.rb b/app/controllers/users/omniauth_callbacks_controller.rb new file mode 100644 index 0000000..565c6ed --- /dev/null +++ b/app/controllers/users/omniauth_callbacks_controller.rb @@ -0,0 +1,30 @@ +# frozen_string_literal: true + +class Users::OmniauthCallbacksController < Devise::OmniauthCallbacksController + # You should configure your model like this: + # devise :omniauthable, omniauth_providers: [:twitter] + + # You should also create an action method in this controller like this: + # def twitter + # end + + # More info at: + # https://github.com/plataformatec/devise#omniauth + + # GET|POST /resource/auth/twitter + # def passthru + # super + # end + + # GET|POST /users/auth/twitter/callback + # def failure + # super + # end + + # protected + + # The path used when OmniAuth fails + # def after_omniauth_failure_path_for(scope) + # super(scope) + # end +end diff --git a/app/controllers/users/passwords_controller.rb b/app/controllers/users/passwords_controller.rb new file mode 100644 index 0000000..259dbb0 --- /dev/null +++ b/app/controllers/users/passwords_controller.rb @@ -0,0 +1,34 @@ +# frozen_string_literal: true + +class Users::PasswordsController < Devise::PasswordsController + # GET /resource/password/new + # def new + # super + # end + + # POST /resource/password + # def create + # super + # end + + # GET /resource/password/edit?reset_password_token=abcdef + # def edit + # super + # end + + # PUT /resource/password + # def update + # super + # end + + # protected + + # def after_resetting_password_path_for(resource) + # super(resource) + # end + + # The path used after sending reset password instructions + # def after_sending_reset_password_instructions_path_for(resource_name) + # super(resource_name) + # end +end diff --git a/app/controllers/users/registrations_controller.rb b/app/controllers/users/registrations_controller.rb new file mode 100644 index 0000000..b9e664f --- /dev/null +++ b/app/controllers/users/registrations_controller.rb @@ -0,0 +1,62 @@ +# frozen_string_literal: true + +class Users::RegistrationsController < Devise::RegistrationsController + # before_action :configure_sign_up_params, only: [:create] + # before_action :configure_account_update_params, only: [:update] + + # GET /resource/sign_up + # def new + # super + # end + + # POST /resource + # def create + # super + # end + + # GET /resource/edit + # def edit + # super + # end + + # PUT /resource + # def update + # super + # end + + # DELETE /resource + # def destroy + # super + # end + + # GET /resource/cancel + # Forces the session data which is usually expired after sign + # in to be expired now. This is useful if the user wants to + # cancel oauth signing in/up in the middle of the process, + # removing all OAuth session data. + # def cancel + # super + # end + + # protected + + # If you have extra params to permit, append them to the sanitizer. + # def configure_sign_up_params + # devise_parameter_sanitizer.permit(:sign_up, keys: [:attribute]) + # end + + # If you have extra params to permit, append them to the sanitizer. + # def configure_account_update_params + # devise_parameter_sanitizer.permit(:account_update, keys: [:attribute]) + # end + + # The path used after sign up. + # def after_sign_up_path_for(resource) + # super(resource) + # end + + # The path used after sign up for inactive accounts. + # def after_inactive_sign_up_path_for(resource) + # super(resource) + # end +end diff --git a/app/controllers/users/sessions_controller.rb b/app/controllers/users/sessions_controller.rb new file mode 100644 index 0000000..a0f9b48 --- /dev/null +++ b/app/controllers/users/sessions_controller.rb @@ -0,0 +1,27 @@ +# frozen_string_literal: true + +class Users::SessionsController < Devise::SessionsController + # before_action :configure_sign_in_params, only: [:create] + + # GET /resource/sign_in + # def new + # super + # end + + # POST /resource/sign_in + # def create + # super + # end + + # DELETE /resource/sign_out + # def destroy + # super + # end + + # protected + + # If you have extra params to permit, append them to the sanitizer. + # def configure_sign_in_params + # devise_parameter_sanitizer.permit(:sign_in, keys: [:attribute]) + # end +end diff --git a/app/controllers/users/unlocks_controller.rb b/app/controllers/users/unlocks_controller.rb new file mode 100644 index 0000000..2c410dc --- /dev/null +++ b/app/controllers/users/unlocks_controller.rb @@ -0,0 +1,30 @@ +# frozen_string_literal: true + +class Users::UnlocksController < Devise::UnlocksController + # GET /resource/unlock/new + # def new + # super + # end + + # POST /resource/unlock + # def create + # super + # end + + # GET /resource/unlock?unlock_token=abcdef + # def show + # super + # end + + # protected + + # The path used after sending unlock password instructions + # def after_sending_unlock_instructions_path_for(resource) + # super(resource) + # end + + # The path used after unlocking the resource + # def after_unlock_path_for(resource) + # super(resource) + # end +end diff --git a/app/helpers/friendships_helper.rb b/app/helpers/friendships_helper.rb new file mode 100644 index 0000000..64f89ba --- /dev/null +++ b/app/helpers/friendships_helper.rb @@ -0,0 +1,2 @@ +module FriendshipsHelper +end diff --git a/app/models/friendship.rb b/app/models/friendship.rb new file mode 100644 index 0000000..beb516b --- /dev/null +++ b/app/models/friendship.rb @@ -0,0 +1,4 @@ +class Friendship < ApplicationRecord + belongs_to :user + belongs_to :friend, class_name: :User +end diff --git a/app/models/user.rb b/app/models/user.rb index 427d432..539dadd 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -7,8 +7,18 @@ class User < ApplicationRecord has_many :comments has_many :likes + has_many :friendships + has_many :friends, through: :friendships + + has_many :inverse_friendships, class_name: "Friendship", foreign_key: "friend_id" + has_many :inverse_friends, through: :inverse_friendships, source: :user + def liked?(likable) self.likes.find_by(likable_id: likable.id, likable_type: likable.class.name) end -end + def friendship?(friend) + self.friendships.find_by(friend_id: friend.id) + end + +end \ No newline at end of file diff --git a/app/views/home/_user.html.erb b/app/views/home/_user.html.erb index da849e1..2c0b5e2 100644 --- a/app/views/home/_user.html.erb +++ b/app/views/home/_user.html.erb @@ -1,3 +1,8 @@
      • <%= link_to "#{user.first_name} #{user.last_name}", home_show_path %> + <% if current_user.friendship?(user) %> + <%= link_to ' Friend', friendship_path(id: current_user.friendship?(user).id), method: :delete, class: "fa fa-check" %> + <% else %> + <%= link_to 'Add Friend', friendships_path(friend_id: user), method: :post %> + <% end %>
      • \ No newline at end of file diff --git a/app/views/home/friends.html.erb b/app/views/home/friends.html.erb new file mode 100644 index 0000000..8ea5b72 --- /dev/null +++ b/app/views/home/friends.html.erb @@ -0,0 +1,42 @@ + + + +
        +
        +<%= form_with url: home_search_path, method: :get do |form| %> + <%= form.text_field :friend %> + <%= form.submit :search %> +<% end %> +

        + +
        +
          + <% @friends.each do |f| %> +
        • <%= "#{f.first_name} #{f.last_name}\t" %> Friend
        • + <% end %> +
        +
        \ No newline at end of file diff --git a/app/views/home/index.html.erb b/app/views/home/index.html.erb index 1e499c2..44ec67a 100644 --- a/app/views/home/index.html.erb +++ b/app/views/home/index.html.erb @@ -1,8 +1,17 @@ @@ -11,17 +20,10 @@
        @@ -31,35 +33,4 @@ <%= form.text_field :friend %> <%= form.submit :search %> <% end %> -

        - -
        -
          - -
          -
          - <%= form_with scope: :post,url: posts_path do |form| %> -

          - <%= form.label :content %>
          - <%= form.text_field :content, placeholder: "share your wits.."%> - <%= form.file_field :image %> -

          - -

          - <%= form.submit :create%> -

          - - <% end %> -
          -
          - -
          - <% @posts.each do |post| %> -
        • - <%= render(partial: 'post', :locals => {:post => post}) %> -
        • - <% end %> -
          - -
        -
        \ No newline at end of file +

        \ No newline at end of file diff --git a/app/views/home/show.html.erb b/app/views/home/show.html.erb index e69de29..a5b54d9 100644 --- a/app/views/home/show.html.erb +++ b/app/views/home/show.html.erb @@ -0,0 +1,67 @@ + + + +
        +
        +<%= form_with url: home_search_path, method: :get do |form| %> + <%= form.text_field :friend %> + <%= form.submit :search %> +<% end %> +

        + +
        +
          + +
          +
          + <%= form_with scope: :post,url: posts_path do |form| %> +

          + <%= form.label :content %>
          + <%= form.text_field :content, placeholder: "share your wits.."%> + <%= form.file_field :image %> +

          + +

          + <%= form.submit :create%> +

          + + <% end %> +
          +
          + +
          + <% @user.posts.each do |post| %> +
        • + <%= render(partial: 'post', :locals => {:post => post}) %> +
        • + <% end %> +
          + +
        +
        \ No newline at end of file diff --git a/config/routes.rb b/config/routes.rb index d459ece..24dcbaa 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -4,6 +4,7 @@ get 'welcome/sign_in' get 'welcome/sign_up' get 'home/search' + get 'home/friends' resources :posts do resources :comments @@ -16,6 +17,7 @@ resources :likes end + resources :friendships devise_for :users root 'home#index' # For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html diff --git a/db/migrate/20190313115322_create_friendships.rb b/db/migrate/20190313115322_create_friendships.rb new file mode 100644 index 0000000..efd81c8 --- /dev/null +++ b/db/migrate/20190313115322_create_friendships.rb @@ -0,0 +1,10 @@ +class CreateFriendships < ActiveRecord::Migration[5.2] + def change + create_table :friendships do |t| + t.integer :user_id + t.integer :friend_id + + t.timestamps + end + end +end diff --git a/db/schema.rb b/db/schema.rb index 17dd258..d560805 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -10,7 +10,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema.define(version: 2019_03_12_143225) do +ActiveRecord::Schema.define(version: 2019_03_13_115322) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" @@ -46,6 +46,13 @@ t.index ["user_id"], name: "index_comments_on_user_id" end + create_table "friendships", force: :cascade do |t| + t.integer "user_id" + t.integer "friend_id" + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + end + create_table "likes", force: :cascade do |t| t.bigint "user_id" t.string "likable_type" diff --git a/test/controllers/friendships_controller_test.rb b/test/controllers/friendships_controller_test.rb new file mode 100644 index 0000000..fcf7413 --- /dev/null +++ b/test/controllers/friendships_controller_test.rb @@ -0,0 +1,7 @@ +require 'test_helper' + +class FriendshipsControllerTest < ActionDispatch::IntegrationTest + # test "the truth" do + # assert true + # end +end diff --git a/test/fixtures/friendships.yml b/test/fixtures/friendships.yml new file mode 100644 index 0000000..0f22a6e --- /dev/null +++ b/test/fixtures/friendships.yml @@ -0,0 +1,9 @@ +# Read about fixtures at http://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html + +one: + user_id: 1 + friend_id: 1 + +two: + user_id: 1 + friend_id: 1 diff --git a/test/models/friendship_test.rb b/test/models/friendship_test.rb new file mode 100644 index 0000000..aa27b3f --- /dev/null +++ b/test/models/friendship_test.rb @@ -0,0 +1,7 @@ +require 'test_helper' + +class FriendshipTest < ActiveSupport::TestCase + # test "the truth" do + # assert true + # end +end From 7205b60163b01e175e327e7f92483dd5aa848559 Mon Sep 17 00:00:00 2001 From: shubham Date: Thu, 14 Mar 2019 13:59:35 +0530 Subject: [PATCH 03/17] styling using rubocop --- app/controllers/application_controller.rb | 9 ++++----- app/controllers/comments_controller.rb | 13 ++++++------- app/controllers/friendships_controller.rb | 9 ++------- app/controllers/home_controller.rb | 21 +++++++++------------ app/controllers/likes_controller.rb | 20 ++++++++++---------- app/controllers/posts_controller.rb | 10 +++++----- app/controllers/welcome_controller.rb | 1 - app/models/user.rb | 15 ++++++++------- app/views/comments/_comment_like.html.erb | 4 ++-- app/views/home/_like.html.erb | 4 ++-- app/views/home/_user.html.erb | 4 ++-- 11 files changed, 50 insertions(+), 60 deletions(-) diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index 5ccac54..864a103 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -4,9 +4,8 @@ class ApplicationController < ActionController::Base protected - def configure_permitted_parameters - devise_parameter_sanitizer.permit(:sign_up) { |u| u.permit(:first_name, :last_name, :email, :password, :sex)} - devise_parameter_sanitizer.permit(:account_update) { |u| u.permit(:first_name, :last_name, :email, :password, :sex, :current_password)} - end - + def configure_permitted_parameters + devise_parameter_sanitizer.permit(:sign_up) { |u| u.permit(:first_name, :last_name, :email, :password, :sex) } + devise_parameter_sanitizer.permit(:account_update) { |u| u.permit(:first_name, :last_name, :email, :password, :sex, :current_password) } + end end diff --git a/app/controllers/comments_controller.rb b/app/controllers/comments_controller.rb index 4e683c4..fd1360d 100644 --- a/app/controllers/comments_controller.rb +++ b/app/controllers/comments_controller.rb @@ -7,7 +7,6 @@ def create respond_to do |format| format.js end - end def index @@ -27,12 +26,12 @@ def destroy end private - def comment_params - params.require(:comment).permit(:content) - end - def find_post - @post = Post.find_by_id(params[:post_id]) - end + def comment_params + params.require(:comment).permit(:content) + end + def find_post + @post = Post.find_by_id(params[:post_id]) + end end diff --git a/app/controllers/friendships_controller.rb b/app/controllers/friendships_controller.rb index b44e874..6bde7fc 100644 --- a/app/controllers/friendships_controller.rb +++ b/app/controllers/friendships_controller.rb @@ -3,12 +3,8 @@ class FriendshipsController < ApplicationController def create @friendship = current_user.friendships.build(friend_id: params[:friend_id]) - if @friendship.save - redirect_to root_url - else - flash[:notice] = "Unable to add friend." - redirect_to root_url - end + flash[:notice] = 'Unable to add friend' unless @friendship.save + redirect_to root_url end def destroy @@ -16,5 +12,4 @@ def destroy @friendship.destroy redirect_to root_url end - end diff --git a/app/controllers/home_controller.rb b/app/controllers/home_controller.rb index 55849c1..28efa2d 100644 --- a/app/controllers/home_controller.rb +++ b/app/controllers/home_controller.rb @@ -1,26 +1,23 @@ class HomeController < ApplicationController - def index - if !(user_signed_in?) - redirect_to welcome_sign_in_path - end + redirect_to welcome_sign_in_path unless user_signed_in? end def search - if params[:friend] - @users = User.where('first_name LIKE ?', "%#{params[:friend]}%") - else - @users = User.all - end + @users = + if params[:friend] + User.search_by_first_name(params[:friend]) + else + User.all + end end def friends - @friends = current_user.friends - @friends = @friends + (current_user.inverse_friends) + friends = current_user.friends + @friends = friends + current_user.inverse_friends end def show @user = User.find_by_id(params[:user_id]) end - end diff --git a/app/controllers/likes_controller.rb b/app/controllers/likes_controller.rb index 82257af..855366d 100644 --- a/app/controllers/likes_controller.rb +++ b/app/controllers/likes_controller.rb @@ -1,6 +1,6 @@ class LikesController < ApplicationController before_action :authenticate_user!, :set_up_likable - + def create @like = @likable.likes.new @like.user_id = current_user.id @@ -9,7 +9,7 @@ def create format.js end end - + def destroy @like = @likable.likes.find(params[:id]) @like.destroy @@ -17,15 +17,15 @@ def destroy format.js end end - + private - + def set_up_likable - if params[:post_id] - @likable = Post.find(params[:post_id]) - else - @likable = Comment.find(params[:comment_id]) - end + @likable = + if params[:post_id] + Post.find(params[:post_id]) + else + Comment.find(params[:comment_id]) + end end - end diff --git a/app/controllers/posts_controller.rb b/app/controllers/posts_controller.rb index e286728..97757da 100644 --- a/app/controllers/posts_controller.rb +++ b/app/controllers/posts_controller.rb @@ -12,8 +12,8 @@ def create @post.save respond_to do |format| format.js - format.html {redirect_to root_path} - end + format.html { redirect_to root_path } + end end def destroy @@ -23,8 +23,8 @@ def destroy end private - def post_params - params.require(:post).permit(:content) - end + def post_params + params.require(:post).permit(:content) + end end diff --git a/app/controllers/welcome_controller.rb b/app/controllers/welcome_controller.rb index f933d89..c3cbd65 100644 --- a/app/controllers/welcome_controller.rb +++ b/app/controllers/welcome_controller.rb @@ -1,5 +1,4 @@ class WelcomeController < ApplicationController - def sign_in end diff --git a/app/models/user.rb b/app/models/user.rb index 539dadd..d552177 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -10,15 +10,16 @@ class User < ApplicationRecord has_many :friendships has_many :friends, through: :friendships - has_many :inverse_friendships, class_name: "Friendship", foreign_key: "friend_id" + has_many :inverse_friendships, class_name: 'Friendship', foreign_key: 'friend_id' has_many :inverse_friends, through: :inverse_friendships, source: :user - def liked?(likable) - self.likes.find_by(likable_id: likable.id, likable_type: likable.class.name) - end + scope :search_by_first_name, ->(first_name) { where('first_name LIKE ?', "%#{first_name}%") } - def friendship?(friend) - self.friendships.find_by(friend_id: friend.id) + def find_like(likable) + likes.find_by(likable_id: likable.id, likable_type: likable.class.name) end -end \ No newline at end of file + def find_friendship(friend) + friendships.find_by(friend_id: friend.id) + end +end diff --git a/app/views/comments/_comment_like.html.erb b/app/views/comments/_comment_like.html.erb index b603ff7..31f04ab 100644 --- a/app/views/comments/_comment_like.html.erb +++ b/app/views/comments/_comment_like.html.erb @@ -1,5 +1,5 @@ -<% if current_user.liked?(comment) %> - <%= link_to 'Like', comment_like_path(comment_id: comment.id, id: current_user.liked?(comment).id), method: :delete, remote: true %> +<% if current_user.find_like(comment) %> + <%= link_to 'Like', comment_like_path(comment_id: comment.id, id: current_user.find_like(comment).id), method: :delete, remote: true %> <% else %> <%= link_to 'Like', comment_likes_path(comment_id: comment.id), method: :post, remote: true %> <% end %> \ No newline at end of file diff --git a/app/views/home/_like.html.erb b/app/views/home/_like.html.erb index ea544fd..e5d1412 100644 --- a/app/views/home/_like.html.erb +++ b/app/views/home/_like.html.erb @@ -1,5 +1,5 @@ -<% if current_user.liked?(post) %> - <%= link_to ' Like', post_like_path(post_id: post.id, id: current_user.liked?(post).id), method: :delete, remote: true, class: "fa fa-thumbs-up btn", style: "color:lightskyblue;" %> +<% if current_user.find_like(post) %> + <%= link_to ' Like', post_like_path(post_id: post.id, id: current_user.find_like(post).id), method: :delete, remote: true, class: "fa fa-thumbs-up btn", style: "color:lightskyblue;" %> <% else %> <%= link_to ' Like', post_likes_path(post_id: post.id), method: :post, remote: true, class: "fa fa-thumbs-up btn"%> <% end %> \ No newline at end of file diff --git a/app/views/home/_user.html.erb b/app/views/home/_user.html.erb index 2c0b5e2..ecd318b 100644 --- a/app/views/home/_user.html.erb +++ b/app/views/home/_user.html.erb @@ -1,7 +1,7 @@
      • <%= link_to "#{user.first_name} #{user.last_name}", home_show_path %> - <% if current_user.friendship?(user) %> - <%= link_to ' Friend', friendship_path(id: current_user.friendship?(user).id), method: :delete, class: "fa fa-check" %> + <% if current_user.find_friendship(user) %> + <%= link_to ' Friend', friendship_path(id: current_user.find_friendship(user).id), method: :delete, class: "fa fa-check" %> <% else %> <%= link_to 'Add Friend', friendships_path(friend_id: user), method: :post %> <% end %> From aac43360ad3fcd94215ec00ecf96b8a86b03dce3 Mon Sep 17 00:00:00 2001 From: shubham Date: Thu, 14 Mar 2019 16:54:53 +0530 Subject: [PATCH 04/17] created partial for navbar and moved header to application file --- app/controllers/home_controller.rb | 17 ++++++++- app/views/home/_navbar.html.erb | 13 +++++++ app/views/home/_post.html.erb | 2 +- app/views/home/_user.html.erb | 2 +- app/views/home/about.html.erb | 1 + app/views/home/friends.html.erb | 52 +++++++------------------- app/views/home/index.html.erb | 36 ------------------ app/views/home/photos.html.erb | 1 + app/views/home/show.html.erb | 37 +----------------- app/views/layouts/application.html.erb | 23 +++++++++++- config/routes.rb | 2 + 11 files changed, 69 insertions(+), 117 deletions(-) create mode 100644 app/views/home/_navbar.html.erb create mode 100644 app/views/home/about.html.erb create mode 100644 app/views/home/photos.html.erb diff --git a/app/controllers/home_controller.rb b/app/controllers/home_controller.rb index 28efa2d..d8ed517 100644 --- a/app/controllers/home_controller.rb +++ b/app/controllers/home_controller.rb @@ -1,4 +1,6 @@ class HomeController < ApplicationController + before_action :find_user + def index redirect_to welcome_sign_in_path unless user_signed_in? end @@ -12,12 +14,23 @@ def search end end + def about + end + def friends - friends = current_user.friends - @friends = friends + current_user.inverse_friends + friends = @user.friends + @friends = friends + @user.inverse_friends + end + + def photos end def show + end + + private + + def find_user @user = User.find_by_id(params[:user_id]) end end diff --git a/app/views/home/_navbar.html.erb b/app/views/home/_navbar.html.erb new file mode 100644 index 0000000..01a9ba3 --- /dev/null +++ b/app/views/home/_navbar.html.erb @@ -0,0 +1,13 @@ + +
        diff --git a/app/views/home/_post.html.erb b/app/views/home/_post.html.erb index 026d2b3..a79376a 100644 --- a/app/views/home/_post.html.erb +++ b/app/views/home/_post.html.erb @@ -5,7 +5,7 @@ <%= post.timestamp %>
        <%= post.content %>
        <% if post.image.attached? %> - <%= image_tag post.image, style: "width:20rem;" %> + <%= image_tag post.image, style: "width:100%;" %> <% end %>
        diff --git a/app/views/home/_user.html.erb b/app/views/home/_user.html.erb index ecd318b..c2354f4 100644 --- a/app/views/home/_user.html.erb +++ b/app/views/home/_user.html.erb @@ -1,5 +1,5 @@
      • - <%= link_to "#{user.first_name} #{user.last_name}", home_show_path %> + <%= link_to "#{user.first_name} #{user.last_name}", home_show_path(user_id: user.id) %> <% if current_user.find_friendship(user) %> <%= link_to ' Friend', friendship_path(id: current_user.find_friendship(user).id), method: :delete, class: "fa fa-check" %> <% else %> diff --git a/app/views/home/about.html.erb b/app/views/home/about.html.erb new file mode 100644 index 0000000..f68a6f8 --- /dev/null +++ b/app/views/home/about.html.erb @@ -0,0 +1 @@ +<%= render(partial: 'home/navbar', locals: {user: @user}) %> diff --git a/app/views/home/friends.html.erb b/app/views/home/friends.html.erb index 8ea5b72..f4e6d04 100644 --- a/app/views/home/friends.html.erb +++ b/app/views/home/friends.html.erb @@ -1,42 +1,16 @@ - +<%= render(partial: 'home/navbar', locals: {user: @user}) %> - -
        -
        -<%= form_with url: home_search_path, method: :get do |form| %> - <%= form.text_field :friend %> - <%= form.submit :search %> -<% end %> -

        - -
        -
          - <% @friends.each do |f| %> -
        • <%= "#{f.first_name} #{f.last_name}\t" %> Friend
        • - <% end %> -
        \ No newline at end of file diff --git a/app/views/home/index.html.erb b/app/views/home/index.html.erb index 44ec67a..e69de29 100644 --- a/app/views/home/index.html.erb +++ b/app/views/home/index.html.erb @@ -1,36 +0,0 @@ - - - -
        -
        -<%= form_with url: home_search_path, method: :get do |form| %> - <%= form.text_field :friend %> - <%= form.submit :search %> -<% end %> -

        \ No newline at end of file diff --git a/app/views/home/photos.html.erb b/app/views/home/photos.html.erb new file mode 100644 index 0000000..f68a6f8 --- /dev/null +++ b/app/views/home/photos.html.erb @@ -0,0 +1 @@ +<%= render(partial: 'home/navbar', locals: {user: @user}) %> diff --git a/app/views/home/show.html.erb b/app/views/home/show.html.erb index a5b54d9..2f763ce 100644 --- a/app/views/home/show.html.erb +++ b/app/views/home/show.html.erb @@ -1,39 +1,4 @@ - - - -
        -
        -<%= form_with url: home_search_path, method: :get do |form| %> - <%= form.text_field :friend %> - <%= form.submit :search %> -<% end %> -

        +<%= render(partial: 'home/navbar', locals: {user: @user}) %>
          diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb index 5e46e26..68d1cd9 100644 --- a/app/views/layouts/application.html.erb +++ b/app/views/layouts/application.html.erb @@ -1,7 +1,7 @@ - Fb + Science Buzz <%= csrf_meta_tags %> <%= csp_meta_tag %> @@ -17,7 +17,26 @@ - + <% if user_signed_in? %> + + <% end %> <%= yield %> diff --git a/config/routes.rb b/config/routes.rb index 24dcbaa..89031a6 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -5,6 +5,8 @@ get 'welcome/sign_up' get 'home/search' get 'home/friends' + get 'home/about' + get 'home/photos' resources :posts do resources :comments From 1db54a2234b59f4c05e9eba5b073be56e3bbab67 Mon Sep 17 00:00:00 2001 From: shubham Date: Thu, 14 Mar 2019 22:14:17 +0530 Subject: [PATCH 05/17] friend request feature added --- app/controllers/friendships_controller.rb | 10 ++- app/controllers/home_controller.rb | 2 +- app/views/home/_friendship.html.erb | 11 +++ app/views/home/_post.html.erb | 68 ++++++++++++------- .../home/{_navbar.html.erb => _top.html.erb} | 16 +++++ app/views/home/_user.html.erb | 8 --- app/views/home/about.html.erb | 2 +- app/views/home/friends.html.erb | 6 +- app/views/home/photos.html.erb | 2 +- app/views/home/search.html.erb | 18 +++++ app/views/home/search.js.erb | 1 - app/views/home/show.html.erb | 2 +- app/views/layouts/application.html.erb | 2 +- ...0190314142721_add_status_to_friendships.rb | 5 ++ db/schema.rb | 3 +- 15 files changed, 112 insertions(+), 44 deletions(-) create mode 100644 app/views/home/_friendship.html.erb rename app/views/home/{_navbar.html.erb => _top.html.erb} (54%) delete mode 100644 app/views/home/_user.html.erb create mode 100644 app/views/home/search.html.erb delete mode 100644 app/views/home/search.js.erb create mode 100644 db/migrate/20190314142721_add_status_to_friendships.rb diff --git a/app/controllers/friendships_controller.rb b/app/controllers/friendships_controller.rb index 6bde7fc..6d6feac 100644 --- a/app/controllers/friendships_controller.rb +++ b/app/controllers/friendships_controller.rb @@ -3,7 +3,8 @@ class FriendshipsController < ApplicationController def create @friendship = current_user.friendships.build(friend_id: params[:friend_id]) - flash[:notice] = 'Unable to add friend' unless @friendship.save + @friendship.status = 0 + flash[:notice] = 'Unable to send request' unless @friendship.save redirect_to root_url end @@ -12,4 +13,11 @@ def destroy @friendship.destroy redirect_to root_url end + + def update + by_user = User.find_by_id(params[:friend_id]) + @friendship = by_user.friendships.find_by_id(params[:id]) + flash[:notice] = 'Unable to add friend' unless @friendship.update_attribute(:status, 1) + redirect_to root_url + end end diff --git a/app/controllers/home_controller.rb b/app/controllers/home_controller.rb index d8ed517..2fd8103 100644 --- a/app/controllers/home_controller.rb +++ b/app/controllers/home_controller.rb @@ -19,7 +19,7 @@ def about def friends friends = @user.friends - @friends = friends + @user.inverse_friends + @friends = (friends + @user.inverse_friends).uniq end def photos diff --git a/app/views/home/_friendship.html.erb b/app/views/home/_friendship.html.erb new file mode 100644 index 0000000..8142a63 --- /dev/null +++ b/app/views/home/_friendship.html.erb @@ -0,0 +1,11 @@ +<% if (current_user.find_friendship(user) && (current_user.find_friendship(user).status == 1)) %> + <%= link_to ' Friend', friendship_path(id: current_user.find_friendship(user).id), method: :delete, class: "fa fa-check" %> +<% elsif (user.find_friendship(current_user) && (user.find_friendship(current_user).status == 1)) %> + <%= link_to ' Friend', friendship_path(id: user.find_friendship(current_user).id), method: :delete, class: "fa fa-check" %> +<% elsif current_user.find_friendship(user) %> + <%= link_to 'Requested', friendship_path(id: current_user.find_friendship(user).id), method: :delete %> +<% elsif user.find_friendship(current_user) %> + <%= link_to 'Confirm Request', friendship_path(friend_id: user.id, id: user.find_friendship(current_user).id), method: :patch %> +<% else %> + <%= link_to 'Add Friend', friendships_path(friend_id: user), method: :post %> +<% end %> \ No newline at end of file diff --git a/app/views/home/_post.html.erb b/app/views/home/_post.html.erb index a79376a..2e7d706 100644 --- a/app/views/home/_post.html.erb +++ b/app/views/home/_post.html.erb @@ -1,28 +1,44 @@
          -
          -

          - <%= link_to 'Delete', post_path(post), method: :delete %> - <%= post.timestamp %>
          - <%= post.content %>
          - <% if post.image.attached? %> - <%= image_tag post.image, style: "width:100%;" %> - <% end %> - -


          - > - <%= render(partial: 'home/like', locals: {post: post}) %> +
          +

          + <%= link_to "#{post.user.first_name} #{post.user.last_name}" %>
          + <%= time_ago_in_words(post.created_at) %>
          + <% if current_user==post.user %> + + <%= link_to 'Delete', post_path(post), method: :delete %> + +

          - <%= link_to ' Comments', post_comments_path(post), remote: true, class: "fa fa-comment btn" %> -
          - -
          >
          - -
          - <%= form_with(model: [ post, post.comments.build ], remote: true ) do |f| %> - <%= f.text_field :content, placeholder: "Add a comment.." %> - <%= f.submit("Submit") %> - <% end %> -
          -

          -
          -
          \ No newline at end of file + <% end %> + <%= post.content %>
          + <% if post.image.attached? %> + <%= image_tag post.image, style: "width:100%;" %> + <% end %> + +
          + > + <%= render(partial: 'home/like', locals: {post: post}) %> + + <%= link_to ' Comments', post_comments_path(post), remote: true, class: "fa fa-comment btn" %> +
          + +
          >
          + +
          + <%= form_with(model: [ post, post.comments.build ], remote: true ) do |f| %> + <%= f.text_field :content, placeholder: "Add a comment.." %> + <%= f.submit("Submit") %> + <% end %> +
          +

          +
          +
        + + \ No newline at end of file diff --git a/app/views/home/_navbar.html.erb b/app/views/home/_top.html.erb similarity index 54% rename from app/views/home/_navbar.html.erb rename to app/views/home/_top.html.erb index 01a9ba3..4d50a06 100644 --- a/app/views/home/_navbar.html.erb +++ b/app/views/home/_top.html.erb @@ -1,3 +1,19 @@ +
        + +
        + <%= "#{user.first_name} #{user.last_name}" %> +
        +
        + <% if current_user==user %> + + <% else %> + <%= render(partial: 'friendship', locals:{user: user}) %> + + <% end %> +
        +
        +
        +