戻る

Rails5.0


民泊サイトの構築 Rails5.0

  (0)
2,000円

タスク6-7   管理カレンダーとの連動

このタスクについて


タスクの内容を一部抜粋します。
プロジェクトを購入していただくとこのタスクの内容の全てを読みやすい表示で見ることができます。
プログラムコードが色分けされて見やすくなります。
プログラムコードに行番号が付きます。
本文が色分けされて見やすくなります。
そしてこのアプリケーションのフルコードをダウンロードすることが可能になります。




ホスト用カレンダーで設定した内容が検索結果や予約カレンダーに反映するようにします。


記述更新 app\controllers\pages_controller.rb
46行目から51行目の内容を以下の記述に更新します。
         not_available_in_calendar = Calendar.where( 
          "room_id = ? AND status = ? AND day <= ? AND day >= ?", 
          room.id, 1, end_date, start_date 
        ).limit(1) 
        if not_available.length > 0 || not_available_in_calendar.length > 0 
          @arrRooms.delete(room) 
        end 



app\controllers\pages_controller.rb
 
class PagesController < ApplicationController 

  def home 
      @rooms = Room.where(active: true).limit(3) 
  end 
  
  def search 
    # ステップ 1 
    if params[:search].present? && params[:search].strip != "" 
      session[:loc_search] = params[:search] 
    end 
    arrResult = Array.new 
    # ステップ 2 
    if session[:loc_search] && session[:loc_search] != "" 
      @rooms_address = Room.where(active: true).near(session[:loc_search], 5, order: 'distance') 
    else 
      @rooms_address = Room.where(active: true).all 
    end 
    # ステップ 3 
    @search = @rooms_address.ransack(params[:q]) 
    @rooms = @search.result 
    @arrRooms = @rooms.to_a 
    # ステップ 4 
    if (params[:start_date] && params[:end_date] && !params[:start_date].empty? &&  !params[:end_date].empty?) 
      start_date = Date.parse(params[:start_date]) 
      end_date = Date.parse(params[:end_date]) 
      @rooms.each do |room| 
        not_available = room.reservations.where( 
          "((? <= start_date AND start_date <= ?) 
          OR (? <= end_date AND end_date <= ?) 
          OR (start_date < ? AND ? < end_date)) 
          AND status = ?", 
          start_date, end_date, 
          start_date, end_date, 
          start_date, end_date, 
          1 
        ).limit(1) 
        not_available_in_calendar = Calendar.where( 
          "room_id = ? AND status = ? AND day <= ? AND day >= ?", 
          room.id, 1, end_date, start_date 
        ).limit(1) 
        if not_available.length > 0 || not_available_in_calendar.length > 0 
          @arrRooms.delete(room) 
        end 
      end 
    end 
  end 
end 



記述更新1 app\controllers\rooms_controller.rb
67行目の「preload()」メソッドの内容を以下の記述に更新します。
 
  def preload 
    today = Date.today 
    reservations = @room.reservations.where("(start_date >= ? OR end_date >= ?) AND status = ?", today, today, 1) 
    unavailable_dates = @room.calendars.where("status = ? AND day > ?", 1, today) 
    special_dates = @room.calendars.where("status = ? AND day > ? AND price <> ?",0, today, @room.price) 
    render json: { 
        reservations: reservations, 
        unavailable_dates: unavailable_dates, 
        special_dates: special_dates 
    } 
  end 



記述更新2 app\controllers\rooms_controller.rb
97行目のプライベートメソッド「is_conflict()」の内容を以下の記述に変更しています。
 
    def is_conflict(start_date, end_date, room) 
      check = room.reservations.where("(? < start_date AND end_date < ?) AND status = ?", start_date, end_date, 1) 
      check_2 = room.calendars.where("day BETWEEN ? AND ? AND status = ?", start_date, end_date, 1).limit(1) 
      check.size > 0 || check_2.size > 0 ? true : false 
    end 



app\controllers\rooms_controller.rb
 
class RoomsController < ApplicationController 

  before_action :set_room, except: [:index, :new, :create] 
  before_action :authenticate_user!, except: [:show] 
  before_action :is_authorised, only: [:listing, :pricing, :description, :photo_upload, :amenities, :location, :update] 

  def index 
     @rooms = current_user.rooms 
  end 

  def new 
    @room = current_user.rooms.build 
  end 

  def create 
    if !current_user.is_active_host 
      return redirect_to payout_method_path, alert: "振込口座の登録を先に行ってください。" 
    end    
    @room = current_user.rooms.build(room_params) 
    if @room.save 
      redirect_to listing_room_path(@room), notice: "保存しました。" 
    else 
      flash[:alert] = "問題が発生しました。" 
      render :new 
    end 
  end 

  def show 
    @photos = @room.photos 
    @guest_reviews = @room.guest_reviews 
  end 

  def listing 
  end 

  def pricing 
  end 

  def description 
  end 

  def photo_upload 
      @photos = @room.photos 
  end 

  def amenities 
  end 

  def location 
  end 

  def update 
    new_params = room_params 
    new_params = room_params.merge(active: true) if is_ready_room 
    if @room.update(new_params) 
      flash[:notice] = "保存しました。" 
    else 
      flash[:alert] = "問題が発生しました。" 
    end 
    redirect_back(fallback_location: request.referer) 
  end 

  # 予約 開始日のAJAX 
  def preload 
    today = Date.today 
    reservations = @room.reservations.where("(start_date >= ? OR end_date >= ?) AND status = ?", today, today, 1) 
    unavailable_dates = @room.calendars.where("status = ? AND day > ?", 1, today) 
    special_dates = @room.calendars.where("status = ? AND day > ? AND price <> ?",0, today, @room.price) 
    render json: { 
        reservations: reservations, 
        unavailable_dates: unavailable_dates, 
        special_dates: special_dates 
    } 
  end 

  # 予約 終了日のAJAX 
  def preview 
    start_date = Date.parse(params[:start_date]) 
    end_date = Date.parse(params[:end_date]) 
    output = { 
      conflict: is_conflict(start_date, end_date, @room) 
    } 
    render json: output 
  end 

  private 
    # 予約 プライベートメソッド 
    def is_conflict(start_date, end_date, room) 
      check = room.reservations.where("(? < start_date AND end_date < ?) AND status = ?", start_date, end_date, 1) 
      check_2 = room.calendars.where("day BETWEEN ? AND ? AND status = ?", start_date, end_date, 1).limit(1) 
      check.size > 0 || check_2.size > 0 ? true : false 
    end 

    def set_room 
      @room = Room.find(params[:id]) 
    end 

    def is_authorised 
      redirect_to root_path, alert: "権限がありません。" unless current_user.id == @room.user_id 
    end 

    def is_ready_room 
      !@room.active && !@room.price.blank? && !@room.listing_name.blank? && !@room.photos.blank? && !@room.address.blank? 
    end 

    def room_params 
      params.require(:room).permit(:home_type, :room_type, :accommodate, :bed_room, :bath_room, :listing_name, :summary, :address, :is_tv, :is_kitchen, :is_air, :is_heating, :is_internet, :price, :active, :instant) 
    end 
end 



記述追加 app\controllers\reservations_controller.rb
21行目と35行目に記述を追加し、32行目をコメントアウトしています。
コードをコピーしてファイルを置き換えて下さい。
 
class ReservationsController < ApplicationController 

    before_action :authenticate_user! 
    before_action :set_reservation, only: [:approve, :decline] 
  
    def create 
      room = Room.find(params[:room_id]) 
  
      if current_user == room.user 
        flash[:alert] = "オーナーが予約することはできません。" 
      elsif current_user.stripe_id.blank? 
        flash[:alert] = "予約する前にクレジットカードを登録する必要があります。" 
        return redirect_to payment_method_path 
      else 
  
          start_date = Date.parse(reservation_params[:start_date]) 
          end_date = Date.parse(reservation_params[:end_date]) 
          days = (end_date - start_date).to_i 
          special_dates = room.calendars.where( 
            "status = ? AND day BETWEEN ? AND ? AND price <> ?", 
            0, start_date, end_date, room.price 
          ) 
        if days == 0 
          flash[:alert] = "宿泊日数が1泊以上でなければ予約することはできません。" 
        else 
          @reservation = current_user.reservations.build(reservation_params) 
          @reservation.room = room 
          @reservation.price = room.price 
          #@reservation.total = room.price * days 
          #@reservation.save 
          @reservation.total = room.price * (days - special_dates.count) 
          special_dates.each do |date| 
              @reservation.total += date.price 
          end          
          if @reservation.Waiting! 
            if room.Request? 
              flash[:notice] = "予約承認申請を送信しました。予約が承認されるまでしばらくお待ち下さい。" 
            else 
              charge(room, @reservation) 
            end 
          else 
            flash[:alert] = "ご予約できません!" 
          end 
        end 
      end 
      redirect_to room 
    end 

    # 宿泊者用予約確認 
    def your_trips 
      @trips = current_user.reservations.order(start_date: :asc) 
    end 

    #ホスト用予約確認 
    def your_reservations 
      @rooms = current_user.rooms 
    end 

    def approve 
      charge(@reservation.room, @reservation) 
      redirect_to your_reservations_path 
    end 
  
    def decline 
      @reservation.Declined! 
      redirect_to your_reservations_path 
    end 
    
    private 
    def send_sms(room, reservation) 
      @client = Twilio::REST::Client.new 
      @client.messages.create( 
        from: '+12056565281', 
        to: room.user.phone_number, 
        body: "#{reservation.user.fullname}様、#{room.listing_name}を予約しました。" 
      ) 
    end 
    def charge(room, reservation) 
      host_amount = (reservation.total * 0.8).to_i # 売上の80%がホストに入る 
      if !reservation.user.stripe_id.blank? 
        customer = Stripe::Customer.retrieve(reservation.user.stripe_id) 
        charge = Stripe::Charge.create( 
          :customer => customer.id, 
          :amount => reservation.total, 
          :description => room.listing_name, 
          :currency => "jpy", 
          transfer_data: { 
            amount: host_amount, 
            destination: room.user.merchant_id, # ホストのストライプID 
          }, 
        ) 
  
        if charge 
          reservation.Approved! 
          
          send_sms(room, reservation) if reservation.user.setting.enable_sms 
          ReservationMailer.send_email_to_guest(reservation.user, room, reservation).deliver_later if reservation.user.setting.enable_email 
          flash[:notice] = "お支払い手続きが完了し、ご予約されました。お越しをお待ちしております!" 
        else 
          reservation.Declined! 
          flash[:notice] = "お支払い手続きができません。予約ができませんでした。" 
        end 
      end 
    rescue Stripe::CardError => e 
      reservation.declined! 
      flash[:alert] = e.message 
    end 

    def set_reservation 
      @reservation = Reservation.find(params[:id]) 
    end 

    def reservation_params 
      params.require(:reservation).permit(:start_date, :end_date) 
    end 

  end 
  





この続きはプロジェクトを購入していただくことで見ることができます。
プロジェクトを購入していただくとこのタスクの内容の全てを読みやすい表示で見ることができます。
プログラムコードが色分けされて見やすくなります。
プログラムコードに行番号が付きます。
本文が色分けされて見やすくなります。
そしてプロジェクトを購入するとこのアプリケーションのフルコードをダウンロードすることができます。

まだレビューはありません。

民泊サイトの構築 Rails5.0

2,000円

民泊サイトを構築します。
ホストは部屋を登録し、ゲストは宿泊予約できます。
ゲストはクレジットカードで支払いをし、ホストには料金の80%が自動で口座に振り込まれます。
Googleマップによる表示、AJAX検索、日付カレンダーによる予約、フルカレンダーによる部屋管理ができます。
リアルタイムメッセージにより連絡がとれます。
予約確認メールの送信も可能。
写真のアップロード機能、アマゾンS3の利用方法も解説。
レビュー機能の実装、電話番号認証の実装方法解説。
HEROKUへのデプロイ方法を解説。
フルコードのダウンロード可能。

タスク数: 136