質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

87.59%

follower一覧に、ユーザー情報を表示させたい。

受付中

回答 0

投稿

  • 評価
  • クリップ 0
  • VIEW 283

score 2

解決したいこと

フォローされているユーザーからの情報を表示させたい。

問題となっている箇所

イメージ説明

@profileから情報を抜き取りたいのですが、エラーが起ってしまします。ログでは、インスタンスにフォローしているユーザーの情報が入ってると思っているのですが、表示させることができなかったです。。

userとcompanyモデルを作成してuserからフォローをできるようにしています。

参考

config/routes.rb

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

  devise_for :users, controllers: {
    sessions:      'users/sessions',
    passwords:     'users/passwords',
    registrations: 'users/registrations'
  }
  # For details on the DSL available within this file, see https://guides.rubyonrails.org/routing.html
  root to: 'top#index'
  resources :articles do
    resource :like, only: [:show, :create, :destroy]
  end

  resource :following_list, only: [:show]
  resource :follower_list, only: [:show]

  resources :relationships, only: [:show] do
  resources :follows, only: [:create]
  resources :unfollows, only: [:create]
end

  resource :profile, only: [:show, :edit, :update]
  resource :company_profile, only: [:show, :edit, :update]

  resources :favorites, only: [:index]

end


userモデル

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

   has_many :likes, dependent: :destroy
   has_many :favorite_articles, through: :likes, source: :article
   has_one :profile, dependent: :destroy

   has_many :relationships, dependent: :destroy
   has_many :followings, through: :relationships, source: :company

   delegate :birthday, :age, :gender, to: :profile, allow_nil: true

  def has_liked?(article)
    likes.exists?(article_id: article.id)
  end

  def display_name
    profile&.nickname || self.email.split('@').first
  end

  def prepare_profile
    profile || build_profile
  end

  def follow!(company)
    company_id = get_compay_id(company)

    relationships.create!(company_id: company_id)
  end

  def unfollow!(company)
    company_id = get_compay_id(company)
    relation = relationships.find_by!(company_id: company_id)
    relation.destroy!
  end

  def has_followed?(company)
    relationships.exists?(company_id: company.id)
  end


  def avatar_image
    if profile&.avatar&.attached?
      profile.avatar
    else
      'default-avatar.png'
    end
  end

  private
  def get_compay_id(company)
    if company.is_a?(Company)
      company.id
    else
      company
    end
  end
end

companyモデル

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

  has_many :articles, dependent: :destroy

  has_many :relationships, dependent: :destroy
  has_many :followers, through: :relationships, source: :user


  has_one :company_profile, dependent: :destroy

  def has_written?(article)
    articles.exists?(id: article.id)
  end

  def display_name
    company_profile&.company_name || self.email.split('@').first
  end

  def prepare_company_profile
    company_profile || build_company_profile
  end

  def avatar_image
    if company_profile&.avatar&.attached?
      company_profile.avatar
    else
      'default-avatar.png'
    end
  end
end


profileモデル

class Profile < ApplicationRecord
  enum gender: { male: 0, female: 1, other: 2 }
  belongs_to :user
  has_one_attached :avatar

  def age
    return '不明' unless birthday.present?
    years = Time.zone.now.year - birthday.year
    days = Time.zone.now.yday - birthday.yday

    if days < 0
      "#{years - 1}歳"
    else
      "#{years}歳"
    end
  end
end

follower_lists_controller.rb

class FollowerListsController < ApplicationController
  before_action :authenticate_company!

  def show
    user_ids = current_company.followers.pluck(:id)
    @profile = Profile.where(user_id: user_ids)
  end

end

profiles_controller.rb

class ProfilesController < ApplicationController
  before_action :authenticate_user!

  def show
    @profile = current_user.profile
  end

  def edit
    @profile = current_user.prepare_profile
  end

  def update
    @profile = current_user.prepare_profile
    @profile.assign_attributes(profile_params)
    if @profile.save
      redirect_to profile_path, notice: 'プロフィール更新!'
    else
      flash.now[:error] = '更新できませんでした'
      render :edit
    end
  end

  private
  def profile_params
    params.require(:profile).permit(
      :nickname,
      :last_name,
      :first_name,
      :kana_last_name,
      :kana_first_name,
      :introduction,
      :gender,
      :birthday,
      :subscribed,
      :avatar,
      :address,
      :phone_number
    )
  end
end


view/follower_lists/show.html.erb

<%= image_tag @profile.user.avatar_image %>

情報量多くてすいません。いらない情報、足りない情報があればご教示お願いいたします。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

まだ回答がついていません

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 87.59%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る