Help us understand the problem. What is going on with this article?

新・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
Yuki0531
 Webエンジニアを目指す海外営業ウーマンです。 いずれは、国際ビジネス X エンジニア力で勝負していきます。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away