kodamarisa / osinotameni_yasetai

0 stars 0 forks source link

本番環境下でのエラー #43

Closed kodamarisa closed 2 months ago

kodamarisa commented 4 months ago

app/models/calendae_user.rb

class CalendarUser < ApplicationRecord
  belongs_to :user, polymorphic: true
  belongs_to :calendar
end

app/controllers/application_controller.rb

class ApplicationController < ActionController::Base
  before_action :configure_permitted_parameters, if: :devise_controller?
  before_action :set_current_line_user
  before_action :set_current_calendar

  helper_method :current_line_user, :line_user_signed_in?
  helper_method :current_guest

  protected

  def configure_permitted_parameters
    devise_parameter_sanitizer.permit(:sign_up, keys: [:name])
  end

  def set_current_line_user
    if session[:line_user_id].present?
      @current_line_user = LineUser.find_by(id: session[:line_user_id])
    else
      @current_line_user = nil
    end
  end

  def current_line_user
    @current_line_user
  end

  def line_user_signed_in?
    @current_line_user.present?
  end

  def authenticate_user_or_line_user!
    unless current_user || current_line_user
      redirect_to root_path, alert: 'You must be logged in to access this section.'
    end
  end

  def set_current_calendar
    if params[:calendar_id].present?
      @current_calendar = Calendar.find_by(id: params[:calendar_id])
    elsif session[:current_calendar_id].present?
      @current_calendar = Calendar.find_by(id: session[:current_calendar_id])
    else
      @current_calendar = Calendar.create(title: "Default Calendar")
      session[:current_calendar_id] = @current_calendar.id
    end
  end

  def current_calendar
    @current_calendar
  end

  def current_guest
    if session[:guest_user_id]
      guest_user = GuestUser.find_by(id: session[:guest_user_id])
      return guest_user if guest_user
    end

    guest_user = GuestUser.create!
    session[:guest_user_id] = guest_user.id
    guest_user
  rescue ActiveRecord::RecordNotFound
    session.delete(:guest_user_id)
    guest_user = GuestUser.create!
    session[:guest_user_id] = guest_user.id
    guest_user
  end
end

app/controllers/calendars_controller.rb

class CalendarsController < ApplicationController
  before_action :set_calendar, only: [:show, :edit, :update, :destroy]
  before_action :authenticate_user_or_line_user!, except: [:index, :show, :new, :create, :edit, :update, :destroy] 

  def index
    @calendars = Calendar.all
  end

  def show
    if @calendar
      @customize = Customize.find_by(calendar_id: @calendar.id)
      @events = @calendar.schedules.includes(:exercise)
    else
      render file: "#{Rails.root}/public/404.html", layout: false, status: :not_found
      return
    end
    expires_now
  end

  def new
    @calendar = Calendar.new
  end

  def create
    @calendar = Calendar.new(calendar_params)
    @calendar.user = [current_user, current_guest, current_line_user].find(&:itself)

    if @calendar.user.nil?
      flash[:alert] = 'User must exist'
      render :new
      return
    end

    if @calendar.save
        @calendar.calendar_users.create(user: current_guest) if current_guest && @calendar.save

      if params[:schedule].present?
        handle_successful_save
      else
        redirect_to calendar_path(@calendar), notice: 'Calendar was successfully created.'
      end
    else
      error_messages = @calendar.errors.full_messages.join(', ')
      Rails.logger.error error_messages
      flash[:alert] = error_messages
      render :new
    end
  end

  def edit
  end

  def update
    if @calendar.update(calendar_params)
      redirect_to calendars_path, notice: 'Calendar was successfully updated.'
    else
      render :edit
    end
  end

  private

  def set_calendar
    @calendar = Calendar.find_by(id: params[:id])
    unless @calendar
      @calendar = Calendar.create(title: "Default Calendar")
      session[:current_calendar_id] = @calendar.id
    end
  end

  def calendar_params
    params.require(:calendar).permit(:title, :image)
  end

  def schedule_params
    params.require(:schedule).permit(:start_time, :end_time, :exercise_id, :date, :repetitions, :duration)
  end

  def handle_successful_save
    @schedule = @calendar.schedules.build(schedule_params)
    if @schedule.save
      session[:current_calendar_id] = @calendar.id
      add_current_user_to_calendar if user_signed_in?
      redirect_to calendar_path(@calendar), notice: 'Calendar was successfully created.'
    else
      render :new
    end
  end

  def add_current_user_to_calendar
    @calendar.users << current_user
  end

  def add_current_line_user_to_calendar
    @calendar.line_users << current_line_user
  end
end
kenchasonakai commented 4 months ago

状況がわからないとなんとも言えないので、まずはもともとは動いていたものだと思うので動いていた時と動かなくなった時の差分やご自身で新しく実装したものでなにか関係がありそうなものがないか推測して教えてください

kodamarisa commented 3 months ago

遅くなってしまい、申し訳ございません。 自分で調べた結果、本番環境のマイグレーションが関係あるかもと思い、heroku run rails db:migrate:statusにて調べたところ以下の状態になっていました。

kodamarisa@kodamarisanoMacBook-Pro osinotameni_yasetai % heroku run rails db:migrate:status
Running rails db:migrate:status on ⬢ osinotameni-yasetai... up, run.2581 (Basic)

database: d7upeb6gbducdn

 Status   Migration ID    Migration Name
--------------------------------------------------
   up     20240513141645  ********** NO FILE **********
   up     20240515022111  Create users
   up     20240515022119  Create line users
   up     20240515022121  Create calendars
   up     20240515022341  Create exercises
   up     20240515022424  Create schedules
   up     20240515082212  Create bookmarks
   up     20240520100942  Create calendar users
   up     20240520191431  ********** NO FILE **********
   up     20240521124613  Create customizes
   up     20240522171655  ********** NO FILE **********
   up     20240523033740  ********** NO FILE **********
   up     20240523100252  ********** NO FILE **********
   up     20240524012957  ********** NO FILE **********
   up     20240605072804  Create guest users

もしかして、この「NO FILE」が何か関係しているのではと考えていますが、どうやって消去したらいいのかわかりません。念の為、ロールバックとリセットを行いましたが、「NO FILE」は残ったままになっています。

kenchasonakai commented 3 months ago

NoFileは関係ないような気はしますがデータベースのmigration周りに何か原因がありそうな場合は本番環境のユーザーデータとかは消えてしまいますがHerokuのデータベースを一度削除して作り直すとかすると綺麗に出来るかもです

https://qiita.com/mochi93kou/items/eb4b1e4952084048b13d

kodamarisa commented 3 months ago

返信遅くなってしまい申し訳ございません。 データベースを作り直した結果、トップページからカレンダー画面への移行が本番環境下でもできるようになりました。 「NO FILE」によりローカル環境下と本番環境下でのデータベースの状態が違ったために起こったエラーかなと感じました。 回答ありがとうございます。