AI 설교 해석 - 서비스 + interpret 액션 + Turbo Stream
ID: 8ba3eeec-8b13-402b-b8f8-338d9aba4362
## 목표
설교 노트에서 성경 구절 AI 해석 기능 추가
## 구현 항목
### 1. 서비스 객체
- app/services/ai_sermon_interpreter.rb
- initialize(sermon_note)
- call: 설교 정보로 프롬프트 구성 → OpenAI API 호출 → 해석 결과 반환
- 프롬프트: 한국어, 성경 구절(passage_reference), 설교 제목, 개인 묵상 기반
- 성경 구절 해석 + 적용 포인트 + 핵심 메시지 정리
- API 키: ENV["OPENAI_API_KEY"] 또는 ENV["GEMINI_API_KEY"]
- OpenAI client: OpenAI::Client.new (ruby-openai gem)
- 에러 처리: API 실패 시 에러 메시지 반환
### 2. 컨트롤러 수정
- SermonsController에 interpret 액션 추가:
```ruby
def interpret
@sermon = current_user.sermon_notes.find(params[:id])
service = AiSermonInterpreter.new(@sermon)
result = service.call
if result[:success]
@sermon.update(ai_interpretation: result[:interpretation])
respond_to do |format|
format.turbo_stream
format.html { redirect_to sermon_path(@sermon) }
end
else
respond_to do |format|
format.turbo_stream { render turbo_stream: turbo_stream.replace("ai-interpretation", partial: "sermons/ai_error", locals: { error: result[:error] }) }
format.html { redirect_to sermon_path(@sermon), alert: result[:error] }
end
end
end
```
- before_action :set_sermon에 :interpret 추가
### 3. 뷰 수정
- sermons/show.html.erb 수정:
- AI 해석 섹션에 turbo_frame_tag "ai-interpretation" 추가
- ai_interpretation이 없으면 "AI 해석 요청" 버튼 표시
- ai_interpretation이 있으면 내용 표시 + "재해석" 버튼
- sermons/interpret.turbo_stream.erb: AI 해석 결과 turbo_stream replace
- sermons/_ai_interpretation.html.erb: AI 해석 결과 파셜
- sermons/_ai_error.html.erb: 에러 표시 파셜
### 4. 라우트 수정
- config/routes.rb에서 기존 sermons 리소스에 멤버 라우트 추가:
```ruby
resources :sermons do
member do
post :interpret
end
end
```
### 5. 테스트
- test/controllers/sermons_controller_test.rb에 interpret 테스트 추가:
- POST /sermons/:id/interpret 인증 필수
- POST /sermons/:id/interpret AI 호출 성공 시 결과 저장
- POST /sermons/:id/interpret AI 호출 실패 시 에러 처리
- POST /sermons/:id/interpret 타인 설교 접근 불가
- API 호출은 stub으로 처리
## 기존 코드 참고
- sermon_notes 테이블에 ai_interpretation 컬럼 이미 존재
- sermons/show.html.erb 64-71줄에 AI 해석 표시 코드 이미 존재
- sermons_controller.rb의 sermon_params에 :ai_interpretation 이미 포함
- SermonsController의 set_sermon: `current_user.sermon_notes.find(params[:id])`
## 주의사항
- 기존 sermons 테스트가 깨지지 않게 주의
- fixture 날짜는 과거 고정 날짜 사용 (Date.current 충돌 방지)
- shared 파셜의 strict locals 준수
- ERB 멀티라인 주석 사용 금지
- 전체 테스트 통과 확인: bin/rails test
첨부 이미지
이미지 추가 (Ctrl+V로 붙여넣기 또는 클릭)
JPEG, PNG, GIF, WebP / 최대 10MB
활동 로그
-
팀팀리드 상태 변경: 리뷰 → 완료
2026년 03월 02일 04:44:28
-
Aai-sermon-dev 상태 변경: 진행 중 → 리뷰
2026년 03월 02일 04:42:26
-
Aai-sermon-dev AI 설교 해석 구현 완료
2026년 03월 02일 04:42:26
상세 보기
## 수정/생성한 파일
### 새로 생성
- `app/services/ai_sermon_interpreter.rb` - AI 해석 서비스 객체
- `app/views/sermons/_ai_interpretation.html.erb` - AI 해석 결과 파셜
- `app/views/sermons/_ai_error.html.erb` - 에러 표시 파셜
- `app/views/sermons/interpret.turbo_stream.erb` - Turbo Stream 응답### 수정
- `app/controllers/sermons_controller.rb` - interpret 액션 추가, before_action 확장
- `app/views/sermons/show.html.erb` - AI 해석 섹션을 파셜 렌더링으로 교체
- `config/routes.rb` - sermons에 member route `post :interpret` 추가
- `test/controllers/sermons_controller_test.rb` - interpret 테스트 4개 추가## 테스트 결과
- sermons controller: 21 runs, 55 assertions, 0 failures, 0 errors
- 전체: 331 runs, 759 assertions, 0 failures, 0 errors## 구현 내용
1. **AiSermonInterpreter 서비스**: ruby-openai gem 사용, OpenAI/Gemini 키 자동 감지, 성경 구절 해석 프롬프트
2. **interpret 액션**: HTML fallback + Turbo Stream 지원, 성공 시 ai_interpretation 컬럼 업데이트
3. **뷰**: AI 해석 요청/재해석 버튼 + 결과 표시 + 에러 처리 (Turbo Stream으로 부분 갱신)
4. **테스트**: 인증, 성공, 실패, 타인 접근 거부 4개 케이스 -
Aai-sermon-dev AI 설교 해석 구현 시작
2026년 03월 02일 04:36:41
상세 보기
## 작업 범위
- AiSermonInterpreter 서비스 객체 생성
- SermonsController에 interpret 액션 추가
- Turbo Stream 뷰 + 파셜 생성
- 라우트 수정
- 컨트롤러 테스트 추가## 접근 방식
- 기존 sermons 테스트 16개 유지 확인
- TDD: 테스트 먼저 → 구현 -
Aai-sermon-dev 티켓 클레임 완료
2026년 03월 02일 04:36:35