kazu-0226 / musubu Goto Github PK
View Code? Open in Web Editor NEWポートフォリオはこちら
ポートフォリオはこちら
予約メール配信機能のckeditorの画像アップロード機能を現在未使用にしているが、
利用できるようにする。
画像を挿入したい場合は、アップロードが必須。
それをckeditorで完結させる。
CDNのバージョンを変更して、画像アップロードを可能にする
ckediter+バックエンド(画像アップロード用gemなど)
現在はデプロイ時のエラーのため、下記をコメントアウトしている。
has_attached_file :data
これをS3へのアップロードに変更する
送信後に下記のエラー及び受信者のビューは「・コンテント内容」となる。
ターミナルのエラー
ActionView::Template::Error (undefined method `each' for #ChatMessage:0x0000000006590870):
chat_roomからメッセージの送信
受信者側のビューが崩れる
chat_message_broadcast_job.rbで以下のコードにしているが、
ビュー側でeachを実行できていない。
ApplicationController.render_with_signed_in_user(chat_message.user, partial: 'chat_messages/chat_message', locals: { user_messages: chat_message})
ApplicationController.render_with_signed_in_shop(chat_message.shop,partial: 'chat_messages/chat_message', locals: { _message: chat_message })
メッセージごとではなく、メッセージひとつずつパーシャル化して、表示する(eachを用いない)
ゲストログイン時に退会や変更を出来ないようにする
ゲストアカウントの退会により、ゲストログインが出来なくなることが多々あるため、
変更と退会を制御する。
ゲストアカウントなら変更と退会を制御する。
各コントローラにゲストアカウントか確認して、ゲストの場合はリダイレクト処理する。
チャット未読・既読機能を実装する
ユーザビリティ向上
チャット未読・既読機能を実装する
・メッセージに既読表示
・未読カウントを表示
今回entryテーブルが存在しない。
そのため手段としては、
・メッセージの受信側を指定する。
メッセージに既読ステータスを持たせる
メッセージ送信時に受信側のIDとtype(UserやShop)を取得するカラムを用意。
showページに入室したら、自分のIDとtypeに一致するメッセージを探す。
一致したものが未読なら既読にする。
・ルーム入室時間を取得する。
メッセージに既読ステータスを持たせる。
ルームの入室時間を取得してその時間以降で自分が送っていないメッセージは未読、入室したら既読にする
メールを画像をS3へのアップロード後しばらく経つと画像が表示されなくなる
リッチエディタより、メールを画像をS3へのアップロード
しばらく経つと実際のメールや編集画面で画像が表示されなくなる
画像が表示されなくなる
config.fog_public = false
carrierwave.rb
config.fog_public = true
チャットでメッセージを送信する際にメッセージが2件表示される
ルーム1に入室してメッセージを送る。
ルーム2に入室してメッセージを送る。
ルーム1に入室してメッセージを送る。
ルーム1でメッセージが2件表示される。
メッセージが2件表示される
console.logで確認したところ、eventがページを遷移しても存在している
unsubscribedしてあげる必要がある?
チャットメッセージのハイパーリンクの受信側の表示エラー
https://github.comというメッセージを送信した際の相手の表示が以下となる
https://github.com/'' target='_blank'>https://github.com/' target='_blank'>https://github.com/
メッセージの表示崩れ
.html_safeが効いていない?
POST後の画面をリロードしたのにURLをGETしてしまう
一覧で検索後にリロード
ユーザがリロードした際にエラーが出てしまう
Turbolinks
チャットルームでメッセージ送信すると他のルームでも表示される
他のルームを開きメッセージ受信
違うルームにメッセージが一時的に表示される
jsとchannelでルーム指定できていない
対象ルームの指定
チャットの左右表示分けをしているが、右に表示されることがある
shopとuserという別モデルのため、IDがかぶっている状態でやりとり
自分の送信はないにもかかわらず右に表示される
以下で送信者を判別しているがshopとuserという別モデルのため、IDがかぶる可能性がある
if (data['send_id'] == show_id) {
$('#chat_messages').append(data["message_right"])
} else {
$('#chat_messages').append(data["message_left"])
}
return;
chat_messagesのデータで表示を分ける
現在自分が右、相手が左としているだけであり、表示が見辛い
UI改善
LINEのように時間軸で表示
http://localhost:3000/〇〇/searchで検索結果を表示した後にリロードするとエラーになる
http://localhost:3000/〇〇/searchでsearchアクション実行後にリロード
検索後にリロードした場合はshowアクションが呼び出されるがエラーとなる
検索後にリロードした場合はshowアクションが呼び出される。
GETリクエストではなく、POSTとするため、turbolinksを無効にする
Newsの投稿機能を作成する
登録していないユーザへ向けたnews記事の作成
■Newsモデル
・ニュース画像
・ニュースタイトル
・ニュース本文
・公開開始日
・公開終了日
・登録日
・更新日
■仕様
・公開開始日〜公開終了日の間に公開。
・メール配信の際にニュースにも公開するボタンを作成して、Newsテーブルに保存させる。
(is_news_open)などのカラム追加
ビデオチャットにて音声を認識しない
チャットより通話を開始しても音声を拾うことができない
通話できない
getUserMediaでリクエストは送れている
navigator.mediaDevices.getUserMedia({video: true, audio: true})
.then( stream => {
// 成功時にvideo要素にカメラ映像をセットし、再生
const videoElm = document.getElementById('my-video');
videoElm.srcObject = stream;
videoElm.play();
// 着信時に相手にカメラ映像を返せるように、グローバル変数に保存しておく
localStream = stream;
}).catch( error => {
// 失敗時にはエラーログを出力
console.error('mediaDevice.getUserMedia() error:', error);
return;
});
未定
画像アップロードができない(一度編集する必要がある)
下記で確認画面を挟んでおり、hiddenでparamsを渡しているが、
refileのattachment_fieldでのparamsがうまく渡せていないのではないか
def form
@news = News.new
end
def confirm
@news = News.new(news_params)
if @news.valid?
render :action => 'confirm'
else
flash.now[:alert] = '配信内容に誤り、空欄があります'
render :action => 'form'
end
end
def completed
@news = News.new(news_params)
@news.save
end
confirmの時点でこれは表示されるから、@newsにnews_imageは渡せているが、
下記だとnilになる。
<%= f.hidden_field :news_image, value: @news.news_image %>
S3にアップした際にcacheが保存されるからそこから画像を取得できないか。
ぐるなびAPIを叩いてCategoryモデルに新規登録できるが、
有無に関わらず全て追加されてしまう。
g_category_admins_shops_pathの実行
重複したカテゴリが増えてしまう
バリデーションがや条件がなく、APIを叩いて取得してきたデータを全て格納しているため
バリデーションの追加
category_l_codeが存在していれば新規登録しない
ニュース公開ステータスの更新をバッチ処理で実行する。
表示に関しては公開期間内を条件にしているが、公開期間内でも表示しないことができるように
open_statusを設けている。
これを毎日0時に公開期間が終了している場合は、非表示に処理する。
ニュース公開ステータスの更新をバッチ処理で実行する。
毎日0時に公開期間が終了している場合は、非表示に処理する。
バッチにステータスをチェックするメソッドと更新するメソッドを追加。
チェックメソッドを日付が切り替わるタイミングで処理して、対象が存在すれば更新するメソッドでアップデートする
チャットのメッセージでテキスト内のURLテキストをハイパーリンクにする
利便性向上
下記のようにURLを送信した場合はハイパーリンクに置き換える
https://github.com/
chat_message.helperにメソッド追加。
URI.extractメソッド(条件)
https://docs.ruby-lang.org/ja/latest/method/URI/s/extract.html
gsubメソッド(置換)
https://docs.ruby-lang.org/ja/latest/method/String/i/gsub.html
TOPページの新着案件がログインしていないと見れない
TOPページの新着案件をログインせずにクリック
エラーとなる
コントローラ側で表示条件をユーザ以外、お店以外としているためアクションが呼びだされる
unlessをifに変更
チャットメッセージ送受信をリアルタイム化する
チャット機能でメッセージを送信後、送信者はリダイレクトされるが、受信側はリロードの必要がある
Action Cableの利用
フォロー機能を非同期化する
パフォーマンス向上
各フォロー機能の非同期化
-各リクエストをJS形式に変更(remote: true)
-対応するアクションのjsファイル作成
通話をかけた側はcloseを押してもカメラが終了しない。
チャットルームから通話。
peer
.idを入力して通話開始
closeを押す
掛けられた側はcloseを押すと終了するが、掛けた側が終了しない
カメラが終了しない
document.getElementsByClassName("close")[0].onclick = function() {
const videoElm = document.getElementById('my-video');
videoElm.srcObject.getTracks().forEach(track => track.stop());
};
videoElm.srcObject = null;
Brakemanの導入
ソースコードに、SQLインジェクションなどの脆弱性がないかを解析
Gem導入
group :development do
gem 'brakeman', :require => false
end
Brakemanの実行結果をエクスポート
brakeman -o brakeman.html
userモデルにGoogle認証機能追加したが、複数モデルに対応していないため、
手段を検討
ShopモデルへのGoogle認証機能追加
devise + omniauthableをやめる
検討中
画像アップロード時のプレビューのコードが重複しているのを修正
画像アップロード時のプレビューのコードが重複しているのを修正
画像アップロードをEC3に変更
画像アップロードをEC3に変更
gem "refile-s3"を使用
.html_safeで表示制御
<p class="card-text news-text"><%#= news.content.html_safe %></p>
contentカラムの中に保存されているのがソースコードになっていて、.html_safeでタグを表示しないようにしており、
尚且つ三行以降は表示しないようにしたいが反映されない。
.news-text{
overflow: hidden;
text-overflow: ellipsis;
display: -webkit-box;
-webkit-box-orient: vertical;
-webkit-line-clamp: 3;
}
<%= news.content.html_safe %>
ボックスからはみ出てしまう。
.html_safeを外せば想定通り3行になるため、.html_safe
ひとまずタイトルのみで対応
ニュース作成時の入力欄をhtmlとtextによって切り替える
リッチエディタだとマークアップ記法で保存されるが、
テキストだとタグが不要になるため。
jsでラジオボタンの切り替えでフォームを変える
管理者管理画面でユーザ一覧や店舗一覧などのCSV出力機能の追加
資料作成用
各種一覧のcsv出力機能追加
各種コントローラにcsvを出力するメソッドを追加する
ログインしていないユーザのチャットへのアクセス制御ができていない
ログインしないでroomIDを直接入力
他の人にルームを見られる
block_wrong_chatメソッドでログインしていない時の条件を定義していない
条件追加
チャットでルームを開いた時にリロードしなければ送信できない
一覧や詳細画面からチャットを開いてメッセージ送信
メッセージが反映されない
以下でroom_idを取得して指定している。
room:location.pathname.match(/[0-9]{1,}/).pop()}
しかし/shops/5のページからチャットルーム(/chat_room/1)を開くとすでに
chat_room_channel_5でsubscribedされており、リロードが必要になる
{"channel"=>"ChatRoomChannel", "room"=>"5"}
ChatRoomChannel is transmitting the subscription confirmation
ChatRoomChannel is streaming from chat_room_channel_5
chat_rooms以下の数値を取得するように変更
room:location.pathname.match(/[0-9]{1,}/).pop()}
DM機能をActionCbleを用いて実装したが、shopからuserにメッセージを送信したとき、shopのメッセージが左側に表示される
shopからuserにメッセージを送信
リロードが必要となり、わかりにくい
パーシャルをleftとしているため。
def render_chat_message(chat_message)
if chat_message.user_id.present?
ApplicationController.renderer.render partial: 'chat_messages/chat_message_left', locals: { target_path: Rails.application.routes.url_helpers.user_path(chat_message.user), image_name: :user_image , image: chat_message.user, content:chat_message.content, created_at: chat_message.created_at }
else
ApplicationController.renderer.render partial: 'chat_messages/chat_message_left', locals: { target_path: Rails.application.routes.url_helpers.shop_path(chat_message.shop), image_name: :main_image , image: chat_message.shop, content:chat_message.content, created_at: chat_message.created_at }
end
end
左右分けずにパーシャル化
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.