「config\environments\production.rb」ファイルを編集していきます。
httpsの設定
43行目のコメントアウトを外します。
config.force_ssl = true
画像表示の設定
26行目「config.assets.compile」を「true」にします。
config.assets.compile = true
メールの設定
62行目のコメントアウトを外し、「config.action_mailer.raise_delivery_errors」を「true」にします。
config.action_mailer.raise_delivery_errors = true
開発環境の設定コピー
「config\environments\development.rb」での設定(60行目から)をコピーします。
アクションケーブルの設定が「wss」になっていることに注意して下さい。
「testminpaku」の部分(2ヶ所)はご自分のherokuアプリ名を入れて下さい。
記述追加 config\environments\production.rb(87行目)
#アクションケーブル config.action_cable.url = "wss://macminpaku.herokuapp.com/cable" config.action_mailer.default_url_options = { host: 'https://macminpaku.herokuapp.com/' } #Gメールの設定 config.action_mailer.delivery_method = :smtp config.action_mailer.smtp_settings = { address: "smtp.gmail.com", port: 587, enable_starttls_auto: true, authentication: "plain", user_name: 'win.rails.learn@gmail.com', password: 'vusopllqzbyvvahk' } #アマゾンS3 config.paperclip_defaults = { storage: :s3, path: ':class/:attachment/:id/:style/:filename', s3_host_name: 's3-ap-northeast-1.amazonaws.com', s3_credentials: { bucket: 'winrailslearn', access_key_id: 'AKIAIU4EZ4WK4HU35G4Q', secret_access_key: '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', s3_region: 'ap-northeast-1' } }
config\environments\production.rb
Rails.application.configure do # Settings specified here will take precedence over those in config/application.rb. # Code is not reloaded between requests. config.cache_classes = true # Eager load code on boot. This eager loads most of Rails and # your application in memory, allowing both threaded web servers # and those relying on copy on write to perform better. # Rake tasks automatically ignore this option for performance. config.eager_load = true # Full error reports are disabled and caching is turned on. config.consider_all_requests_local = false config.action_controller.perform_caching = true # Disable serving static files from the `/public` folder by default since # Apache or NGINX already handles this. config.public_file_server.enabled = ENV['RAILS_SERVE_STATIC_FILES'].present? # Compress JavaScripts and CSS. config.assets.js_compressor = :uglifier # config.assets.css_compressor = :sass # Do not fallback to assets pipeline if a precompiled asset is missed. config.assets.compile = true # `config.assets.precompile` and `config.assets.version` have moved to config/initializers/assets.rb # Enable serving of images, stylesheets, and JavaScripts from an asset server. # config.action_controller.asset_host = 'http://assets.example.com' # Specifies the header that your server uses for sending files. # config.action_dispatch.x_sendfile_header = 'X-Sendfile' # for Apache # config.action_dispatch.x_sendfile_header = 'X-Accel-Redirect' # for NGINX # Mount Action Cable outside main process or domain # config.action_cable.mount_path = nil # config.action_cable.url = 'wss://example.com/cable' # config.action_cable.allowed_request_origins = [ 'http://example.com', /http:\/\/example.*/ ] # Force all access to the app over SSL, use Strict-Transport-Security, and use secure cookies. config.force_ssl = true # Use the lowest log level to ensure availability of diagnostic information # when problems arise. config.log_level = :debug # Prepend all log lines with the following tags. config.log_tags = [ :request_id ] # Use a different cache store in production. # config.cache_store = :mem_cache_store # Use a real queuing backend for Active Job (and separate queues per environment) # config.active_job.queue_adapter = :resque # config.active_job.queue_name_prefix = "Minpaku_#{Rails.env}" config.action_mailer.perform_caching = false # Ignore bad email addresses and do not raise email delivery errors. # Set this to true and configure the email server for immediate delivery to raise delivery errors. config.action_mailer.raise_delivery_errors = true # Enable locale fallbacks for I18n (makes lookups for any locale fall back to # the I18n.default_locale when a translation cannot be found). config.i18n.fallbacks = true # Send deprecation notices to registered listeners. config.active_support.deprecation = :notify # Use default logging formatter so that PID and timestamp are not suppressed. config.log_formatter = ::Logger::Formatter.new # Use a different logger for distributed setups. # require 'syslog/logger' # config.logger = ActiveSupport::TaggedLogging.new(Syslog::Logger.new 'app-name') if ENV["RAILS_LOG_TO_STDOUT"].present? logger = ActiveSupport::Logger.new(STDOUT) logger.formatter = config.log_formatter config.logger = ActiveSupport::TaggedLogging.new(logger) end # Do not dump schema after migrations. config.active_record.dump_schema_after_migration = false #アクションケーブル config.action_cable.url = "wss://macminpaku.herokuapp.com/cable" config.action_mailer.default_url_options = { host: 'https://macminpaku.herokuapp.com/' } #Gメールの設定 config.action_mailer.delivery_method = :smtp config.action_mailer.smtp_settings = { address: "smtp.gmail.com", port: 587, enable_starttls_auto: true, authentication: "plain", user_name: 'win.rails.learn@gmail.com', password: 'vusopllqzbyvvahk' } #アマゾンS3 config.paperclip_defaults = { storage: :s3, path: ':class/:attachment/:id/:style/:filename', s3_host_name: 's3-ap-northeast-1.amazonaws.com', s3_credentials: { bucket: 'winrailslearn', access_key_id: 'AKIAIU4EZ4WK4HU35G4Q', secret_access_key: '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', s3_region: 'ap-northeast-1' } } end
リアルタイムメッセージを動かすために「config\cable.yml」ファイルを編集します。
記述更新 config\cable.yml
8行目の「adapter」を「async」に変更します。
「url: redis://localhost:6379/1」の行はコメントアウトして下さい。
development: adapter: async test: adapter: async production: adapter: async # adapter: redis # url: redis://localhost:6379/1
Twilioの無料アカウントでは本番環境での運用ができないのでSMSを送信しようとするとエラーになってしまします。
予約完了時にSMSを送信する設定にしていますが、その部分をコメントアウトします。
PINコードの確認はTwilio無料アカウントでも使用できます。
app\controllers\reservations_controller.rb
99行目をコメントアウトします。
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