Skip to content

Instantly share code, notes, and snippets.

@uekkie
Created February 17, 2026 23:42
Show Gist options
  • Select an option

  • Save uekkie/9047416c6aacca24c30f97219814a512 to your computer and use it in GitHub Desktop.

Select an option

Save uekkie/9047416c6aacca24c30f97219814a512 to your computer and use it in GitHub Desktop.
Rails課題作成 streamlit
import streamlit as st
import google.generativeai as genai
import os
# ページ設定
st.set_page_config(
page_title="Rails学習お題ジェネレーター",
page_icon="💎",
layout="wide"
)
# --- システムプロンプト定義 ---
SYSTEM_PROMPT = """
あなたはRuby on Rails初学者向けの学習カリキュラム作成のプロフェッショナルです。
ユーザーから入力される「想定時間(10h/20h/40h)」「テーマ(任意)」に基づいて、学習用Webアプリの開発要件定義書を作成してください。
## 技術スタックの指定(必須)
以下の技術構成を前提としてカリキュラムを組んでください。
1. **JavaScriptバンドラー**: **esbuild** (importmapは初学者がハマりやすいため使用禁止)
2. **CSSフレームワーク**: **Bootstrap**
3. **ユーザー認証**: **Devise** gem
4. **DB**: PostgreSQL
## 重要な制約事項(Strict Rules)
1. **実装コードの記述禁止**: メソッドの中身など、具体的なRubyのロジックコード(答え)は記述しないでください。
2. **コマンドの記述推奨**: 学習の初速を上げるため、**Railsジェネレータコマンド** は積極的に記述してください。特に `rails new` には必ず `-j esbuild --css bootstrap` オプションを含めてください。
3. **英字カラム名の禁止**: データ設計セクションの表などでは、思考力を養うためカラム名は**日本語**で記述してください。ただし、タスクリスト内のコマンド例では英字カラム名を使用しても構いません。
4. **Google Docs貼り付け用フォーマット**: 出力はMarkdown形式で行い、H1(#), H2(##)の見出し構造を明確にしてください。
5. **Adminモデルの強制**: 管理者機能が必要な場合、Userモデルにフラグを持たせるのではなく、必ず**Adminモデル**を独立させてください。
## 難易度調整の指針
入力された時間に応じて、以下の複雑さを要件に盛り込んでください。
- **10h**: 基本的なCRUDのみ。管理者機能は不要。
- **20h / 40h**: 管理者機能(Adminモデル)の実装必須。
## 「タスクばらし」出力のルール(最重要)
ユーザーが「タスクばらし:ON」を指定した場合のみ、出力の最後に「## 8. 実装タスクリスト(タスクばらし)」というセクションを追加してください。
このリストは以下のルールを厳守して作成してください:
1. **時間制約(Max 30分)**:
- 1つのタスクの見積もり時間は**最大30分**としてください。
- 30分を超えるタスクは許可しません。大きな機能は「モデル作成(20分)」「ビュー作成(30分)」のように細分化してください。
2. **フェーズ時間の記載禁止(矛盾防止)**:
- フェーズのヘッダー(例:「フェーズ1: 環境構築」)には、**合計時間を記載しないでください**。
- AIの性質上、ヘッダーの時間とタスク合計時間がズレるのを防ぐためです。時間は個別のタスクにのみ記載してください。
3. **コマンドの記載**:
- 実行すべきコマンド例を記載してください。
4. **出力フォーマット**:
**フェーズ1:[フェーズ名]**
- [ ] **タスク名** (見積もり: XX分)
- 作業内容を簡潔に記述。
- コマンド例: `rails g ...`
- 確認: 終了判定の基準
## 出力テンプレート
以下のセクション構成で出力してください。
# Rails学習課題:[アプリ名]
## 課題概要
[アプリの概要と目的。制限時間と提出物を記載]
## 1. ユーザー向け機能
...
## 2. 管理者向け機能
...
## 3. 業務ルール
...
## 4. データ項目(日本語のみ・設計は受講者が行う)
[モデル設計表]
## 5. シードデータ
...
## 6. 採点の目安
...
## 7. 注意事項
...
(以下はタスクばらしONの場合のみ出力)
## 8. 実装タスクリスト(タスクばらし)
[ここにて順序立てたタスクリストを出力]
"""
# --- サイドバー: 設定と入力 ---
st.sidebar.header("⚙️ 設定 & 入力")
# APIキー入力
api_key = st.sidebar.text_input(
"Google API Key (Gemini)",
value=os.getenv("GOOGLE_API_KEY", ""),
type="password",
help="Google AI Studioで取得したAPIキーを入力してください"
)
st.sidebar.markdown("---")
# お題の条件入力
target_time = st.sidebar.selectbox("想定所要時間", ["10h", "20h", "40h"], index=2)
theme = st.sidebar.text_input(
"テーマ(任意)",
placeholder="例: 映画館予約、日報管理...",
help="空欄の場合、AIが適当なテーマを選定します。"
)
st.sidebar.info(
"技術スタックは以下で固定されます:\n"
"- Ruby 最新バージョン\n"
"- Rails 最新バージョン\n"
"- PostgreSQL\n"
"- esbuild (JS Bundling)\n"
"- Bootstrap (CSS Bundling)\n"
"- Devise\n"
"- **Adminモデル独立実装** (20h/40hの場合)"
)
# オプション
st.sidebar.markdown("---")
st.sidebar.subheader("オプション")
enable_task_breakdown = st.sidebar.checkbox(
"タスクばらしを出力する",
value=True,
help="要件を最大30分単位の小さなタスクに分解し、コマンド例を含むリストを追加します。"
)
remarks = st.sidebar.text_area(
"その他の指示(補足)",
placeholder="例: レビュー機能は必ずつけてください。",
height=100
)
generate_btn = st.sidebar.button("🚀 お題を生成する", type="primary")
# --- メインエリア: 出力 ---
st.title("💎 Rails学習お題ジェネレーター")
if generate_btn:
if not api_key:
st.error("APIキーを入力してください。")
else:
try:
genai.configure(api_key=api_key)
# 推奨モデルを使用
model = genai.GenerativeModel(
model_name="gemini-pro-latest",
generation_config={"temperature": 0.4},
system_instruction=SYSTEM_PROMPT
)
# ユーザープロンプト
breakdown_instruction = "有効(コマンド例を含めたタスクリストを出力してください)" if enable_task_breakdown else "無効"
user_prompt = f"""
以下の条件でお題を作成してください。
- 想定時間: {target_time}
- テーマ: {theme if theme else 'おまかせ'}
- タスクばらし機能: **{breakdown_instruction}**
- その他要望: {remarks}
"""
with st.spinner("AIが仕様書とタスクを設計中... ☕"):
response = model.generate_content(user_prompt)
result_text = response.text
st.success("生成完了!")
tab1, tab2 = st.tabs(["📄 プレビュー", "📝 コピー用 (Markdown)"])
with tab1:
st.markdown(result_text)
with tab2:
st.info("右上のコピーボタンで全選択コピーし、Google Docsに貼り付けてください。")
st.code(result_text, language="markdown")
except Exception as e:
st.error(f"エラーが発生しました: {e}")
else:
st.info("👈 サイドバーの設定を行って生成ボタンを押してください。")
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment