StockNoteは技術記事やメモを投稿・共有できる高機能コミュニティサイトです。 数式・コードブロック・画像を含む投稿が可能で、Markdown記法に対応しています。
- 投稿の公開可視性は
Postモデルのスコープ(published_only,visible_to)を優先して利用する - 似た検索処理はコントローラーで重複実装せず、共通メソッド化して管理する
- テストは「実際に意味があるもの」を優先し、雛形のままの
pendingspec は残さない Postの JSON 本文は、URL形式や必須項目欠落などの境界ケースを model spec で担保する- 変更後は
bundle exec rspecを実行し、0 failures を維持する
- 📝 Markdown対応の投稿エディタ
- 🔢 数式カード(上付き・下付き・左添え字対応)
- 💻 コードブロック(シンタックスハイライト)
- 🖼️ 複数画像の同時アップロード
- 🏷️ タグ機能による投稿分類
- 🔍 高度な検索機能
- 📚 ユーザー別リスト機能(公開設定・並び替え・投稿ごとのメモ)
- ✅ ユーザー登録・ログイン・ログアウト(Devise)
- ✅ ゲストログイン機能
- ✅ ユーザー検索機能
- ✅ ユーザー管理機能(管理者)
- ✅ 投稿の作成・編集・削除
- ✅ 投稿の公開・下書き設定
- ✅ Markdown記法対応
- ✅ 数式カード挿入(上付き・下付き・左添え字)
- ✅ コードブロック挿入(シンタックスハイライト)
- ✅ 複数画像の同時アップロード・埋め込み
- ✅ 統合検索フォーム(投稿一覧・タグ検索・ユーザーページで共通)
- ✅ 複合検索機能(タグ・ユーザー名・投稿日時範囲・ソート順)
- ✅ タグ複数選択検索(初期状態で「すべて」が選択済み)
- ✅ 投稿日時範囲指定(開始日・終了日の23:59:59まで)
- ✅ コメントの作成・削除
- ✅ コメント管理機能(管理者)
- ✅ いいね機能
- ✅ いいね一覧表示
- ✅ グループの作成・編集・削除
- ✅ グループへの参加・退出
- ✅ グループ別投稿表示
- ✅ ユーザーごとに複数のリストを作成可能
- ✅ リストへの投稿追加は「投稿詳細ページ」からのみ実施可能
- ✅ 投稿をリストへ追加できるのは、リスト作成者のみ
- ✅ 1つのリストに複数投稿を登録可能
- ✅ リスト内で投稿の表示順を並び替え可能(上へ/下へ)
- ✅ リストの公開設定(全体公開/非公開)を設定可能(リスト作成者のみ変更可能)
- ✅ リスト内の各投稿に対してメモを1件保存可能(リスト作成者のみ編集可能)
数式(上付き・下付き/左・中央・右に対応した添え字対応)、画像埋め込み、コードブロック表示に対応した投稿例。Markdown記法で作成され、XSS対策済みのサニタイズ処理を経て表示されます。
タグ・ユーザー名・投稿日時範囲・ソート順で複合検索が可能。タグは複数選択可能で、初期状態で「すべて」が選択済み。投稿一覧・タグ検索・ユーザーページで共通のフォームを使用。
- 数式カード:
- 右上付き・右下付き:
^で上付き、_で下付き(例:x^2、a_1) - 左添え字:
[上,下]->基準文字(例:[235,92]->U→ ²³⁵₉₂U) - 右添え字:
基準文字<-[上,下](例:x<-[2,i]→ x²ᵢ) - 中央配置:
基準文字@[上,下](例:Σ@[n,i=1]→ Σⁿᵢ₌₁)
- 右上付き・右下付き:
- コードブロック: シンタックスハイライト対応
- 画像埋め込み: ドラッグ&ドロップまたはファイル選択で複数画像を同時アップロード
- リアルタイムプレビュー: 編集中の内容をカード形式で即座にプレビュー
- セキュリティ: Base64 JSONトークン化保存、XSS対策(html_escape + sanitize)
- 統合検索フォーム: 投稿一覧・タグ検索・ユーザーページで共通
- 複合検索: タグ(複数選択可)、ユーザー名、投稿日時範囲、ソート順を組み合わせ可能
- タグ初期選択: リスト形式で「すべて」が初期状態で選択済みハイライト表示
- ソート順: 新しい順・古い順・更新日時・ユーザー名など6種類
- 日時範囲検索: 終了日は23:59:59まで含む(カスタムpredicate対応)
- Ruby 3.1.2
- Rails 6.1.7
- MySQL2(本番環境)
- SQLite3(開発環境)
- JavaScript (ES6+)
- Webpacker 5.4.4
- Turbolinks
- Bootstrap 5
- Devise - ユーザー認証
- Ransack - 高度な検索機能(カスタムpredicate: lteq_end_of_day)
- Kaminari - ページネーション
- acts-as-taggable-on - タグ機能(Ransack検索対応)
- Redcarpet - Markdown→HTML変換
- ActiveStorage - ファイルアップロード
- AWS EC2
- Puma(アプリケーションサーバー)
- Ruby 3.1.2
- Rails 6.1.7
- Node.js 20.x
- Yarn
cd stock_note
nvm install 20
nvm use 20
node -v
yarn -v
bundle exec rails assets:precompile RAILS_ENV=productionssh -i ~/.ssh/practice-aws.pem ubuntu@<EC2のIP>
if [ ! -d "$HOME/.nvm" ]; then
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.3/install.sh | bash
fi
export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh"
nvm install 20
nvm alias default 20
nvm use 20
node -v
exitgit add .nvmrc package.json .github/workflows/rails.yml README.md
git commit -m "Stabilize deploy with Node 20 baseline"
git push origin main# リポジトリのクローン
git clone https://github.com/your-username/stock_note.git
cd stock_note
# 依存パッケージのインストール
bundle install
yarn install
# データベースのセットアップ
rails db:create
rails db:migrate
rails db:seed
# アセットのコンパイル(本番環境)
RAILS_ENV=production rails assets:precompile
# 開発サーバーの起動
rails serverブラウザで http://localhost:3000 にアクセス
- Email: admin@example.com
- Password: password
- Email: user1@example.com
- Password: password
- Email: user2@example.com
- Password: password
- トップページの「ゲストログイン」ボタンをクリック
app/
├── models/ # データモデル
│ └── concerns/ # モデルの共通機能
├── controllers/ # コントローラー
├── views/ # ビュー
├── helpers/ # ヘルパーメソッド
├── javascript/ # JavaScriptファイル
│ ├── packs/ # Webpackエントリーポイント
│ └── posts_editor.js # 投稿エディタ(数式・コードカード機能)
└── assets/
└── stylesheets/ # CSSファイル
ポートフォリオ用プロジェクトとして継続的に機能追加・改善中です。
- 投稿の公開可視性ロジックを
Postモデルのスコープ(published_only,visible_to)へ集約 - コントローラー内の重複検索処理を整理し、可読性と保守性を向上
- 旧ルーティング前提の request spec を現行ルーティングへ更新
- 雛形のまま
pendingだった低価値の helper/view spec は削除 - 重要な model spec(
Post,User,Like,Group,Comment,PostGroup,GroupMembership)は実装 Postの JSON バリデーションについて、実運用で起きやすい境界ケース(不正URL、必須項目欠落)を追加
bundle exec rspec50 examples, 0 failures

