新・Railsポートフォリオ作成の備忘録②

#5.UsersのProfileを作成する
以下記事を参照に、Usersのprofile作成をする。
https://qiita.com/ryokky59/items/71b5a853989721b89c6e

＜注意点＞
※　app/controllers/user/apprication_controller.rb
のファイルをいじるよう記載があるが、当方の場合、app/controllers/apprication_controller.rbが生成されたので、こちらをいじった。

※resources :users, only: [:show]　と get 'users/show'の二つが作成されていたので、
resources :users, only: [:show] だけにした。

＜生じたエラー＞
上記記事を参照してshowページまで無事にたどり着くか試したかったが上手くいかなかった。

++++++++++++エラー内容++++++++++++++
このサイトにアクセスできません
localhost で接続が拒否されました。
++++++++++++++++++++++++++++++++++

この時、$ rails routes コマンドでルートが正しく設定されているか確認するよう教わった。
https://pikawaka.com/rails/rake_routes

＜解決策＞
以下のようにコードを書き換えるように教わった。

```
Rails.application.routes.draw do
  devise_for :sellers, controllers: {
  sessions:      'sellers/sessions',
  passwords:     'sellers/passwords',
  registrations: 'sellers/registrations'
}
  devise_for :users, controllers: {
    sessions:      'users/sessions',
    passwords:     'users/passwords',
    registrations: 'users/registrations'
  }
  resources :users, only: [:show] ←　ここ
end

```

記事を参考にした際、resources :users, only: [:show]
を一番上に置いた。
ルーティングは一番上にあるコードが優先的になる為、
例えば、/users/sessionsも/users/passwordsも/users/:idのルーティングとして読み込まれ、引数の1のようにsesssionsとpasswordsも引数の一つとして扱われてしまっていた。

＜その他修正点＞

Vessel_Trader_Queen/app/controllers/application_controller.rb 

```
class ApplicationController <　ActionController::Base 

   protect_from_forgery with: :exception 

　　　# deviseコントローラーにストロングパラメータを追加する 
 　　#　before_action:configure_permitted_parameters, if: :devise_controller? 

   protected 
   def configure_permitted_parameters 
     # サインアップ時にnameのストロングパラメータを追加 
     devise_parameter_sanitizer.permit(:show, keys: [:name]) 
     # アカウント編集の時にnameとprofileのストロングパラメータを追加 
     devise_parameter_sanitizer.permit(:account_update, keys: [:name, :introduction]) 
   end 

   # ログイン後、マイページに移動する
   def after_sign_in_path_for(resource)
     user_path(resource)
   end 
 end 
```

Vessel_Trader_Queen/app/controllers/users_controller.rb

```
 class UsersController < ApplicationController 

   # ログイン済ユーザーのみにアクセスを許可する 
   before_action :authenticate_user!, only: [:show] 

   def show 
     if params[:id]
       @user = User.find(params[:id]) #追記 
     end 
   end 
 end 
```

Vessel_Trader_Queen/app/models/user.rb

```
class User < ApplicationRecord 

   # Include default devise modules. Others available are: 
   # :confirmable, :lockable, :timeoutable and :omniauthable 
   devise :database_authenticatable, :registerable, 
          :recoverable, :rememberable, :trackable, :validatable 

          before_save { self.email = email.downcase } 

         #  validates :name,  presence: true, length: { maximum: 50 }
          VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i 
          validates :email, presence: true, length: { maximum: 255 }, 
                            format: { with: VALID_EMAIL_REGEX } 
         #  validates :type, presence: true, length: { maximum: 50 }
         #  validates :industry, length: { maximum: 50 }
         #  validates :introduction,  length: { maximum: 1000 }

end

```

Vessel_Trader_Queen/app/views/users/show.html.erb

```
<h1>Users#show</h1>
<p>名前 : <%= @user.name %></p>
<p>メールアドレス : <%= @user.email %></p>
<p>プロフィール : <%= @user.introduction %></p>
<%= link_to "ログアウト", destroy_user_session_path, method: :delete %>
```

※正しこの時点では「名前とプロフィールが保存できなかった」

#6.Sourcetreeの導入

Sourcetreeが便利だということでSourcetreeをインストールした。

#7.git pull の使用

この時、先生がほとんどのコードを書き換えたので、git pull を使用した。
参考になったのは、以下のページである。

https://qiita.com/wann/items/688bc17460a457104d7d

git fetch + git merge = git pull

git cloneは、チーム開発の初期段階、特に自身のローカルにアプリのコードがない場合に使用する、というイメージ。


#8.名前とプロフィールが保存できない問題の解決

5.のコードを更に以下のように修正した。
また、他の項目も付け足した。

Vessel_Trader_Queen/app/controllers/application_controller.rb 

```
class ApplicationController <　ActionController::Base 

   protect_from_forgery with: :exception 

  # deviseコントローラーを実行する前に、configure_permitted_parametersメソッドを実行する
  before_action :configure_permitted_parameters, if: :devise_controller?

  # sign_upアクション時にnameとintroductionカラムの保存を許可する
  def configure_permitted_parameters
    devise_parameter_sanitizer.permit(:sign_up, keys: [:name, :introduction, :industry, :user_type ])
  end

  # ログイン後、マイページに移動する
  def after_sign_in_path_for(resource)
    user_path(resource)
  end
 end 
```


Vessel_Trader_Queen/app/controllers/users_controller.rb

```
 class UsersController < ApplicationController 

   # ログイン済ユーザーのみにアクセスを許可する 
   before_action :authenticate_user!, only: [:show] 

   def show 
     if params[:id]
       @user = User.find(params[:id]) #追記 
     end 
   end 
 end 
```

Vessel_Trader_Queen/app/models/user.rb

```
class User < ApplicationRecord 

  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :trackable, :validatable

         before_save { self.email = email.downcase }

        #  validates :name,  presence: true, length: { maximum: 50 }
         VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i
         validates :email, presence: true, length: { maximum: 255 },
                           format: { with: VALID_EMAIL_REGEX }
end

```

Vessel_Trader_Queen/app/views/users/show.html.erb

```
<h1>Users#show</h1>
<p>名前 : <%= @user.name %></p>
<p>メールアドレス : <%= @user.email %></p>
<p>自己紹介 : <%= @user.introduction %></p>
<p>業種 : <%= @user.industry %></p>
<p>業務形態 : <%= @user.user_type %></p>
<%= link_to "ログアウト", destroy_user_session_path, method: :delete %>
```

config/routes.rb

```
Rails.application.routes.draw do
  devise_for :sellers, controllers: {
    sessions:      'sellers/sessions',
    passwords:     'sellers/passwords',
    registrations: 'sellers/registrations'
  }

  devise_for :users, controllers: {
    sessions:      'users/sessions',
    passwords:     'users/passwords',
    registrations: 'users/registrations'
  }
  resources :users, only: [:show]
end
```