【Ruby on Rails】カスタムヘルパーのメソッドを、コントローラー内で使用する(chatbotの返信内容をマークダウン記法で出力)

2024/08/07に公開

はじめに

現在Ruby on Railsを使用して、記事投稿アプリを作成しております。
その中でチャットボット機能を作成しました。
チャットボットからの返答内容が、マークダウン記法が適用されない形で出力されていることが気になり、
マークダウン記法が適用されるようコードを修正しました。

その際に、カスタムヘルパーの使い方を改めて学習したので備忘録として残したいと思います。
また、今回の内容はコードの保守性やMVCの観点を鑑みたときに、よくない使用方法だと思うのでもしより良いコードの書き方がありましたらコメント等頂けますととても嬉しいです。

環境

Rails 7.1.3.4

状況

  • チャットボットからの返答が、マークダウン記法が適用されていない状況。
    (gem 'kramdown', gem 'kramdown-parser-gfm'を使用し、マークダウン記法の出力ができるよう設定はしております。今回はその実装方法は割愛致します。)
    Image from Gyazo

コード修正し、下記出力ができるようになりました。
Image from Gyazo

どのようにコード修正を行なったのか

結論から申し上げますと、今回はapp/helpers/application_helper.rbに定義しているマークダウン記法のメソッドを、コントローラー内にインクルードして使用しています。

  • app/helpers/application_helper.rb
def render_markdown(text)
    Kramdown::Document.new(text, input: 'GFM').to_html
  end
  • app/controllers/users_controller.rb
    usersコントローラー内で、collectionルーティングを使用しmy_dashboardsアクション内でチャットボットを作成しております。該当箇所以外は記載を省いております。
class UsersController < ApplicationController

# 追加
  include ApplicationHelper
# ここまで

  def my_dashboards
    @user_input = params[:user_input]
    return if @user_input.blank?

    client = OpenAI::Client.new

    response = client.chat(
      parameters: {
        model: 'gpt-4o-mini', # 必要なモデルを指定
        messages: [
          { role: 'system', content: 'あなたは優秀なWEBエンジニアです。ユーザー入力に応答してください。' },
          { role: 'user', content: @user_input }
        ],
        temperature: 0.7,
        max_tokens: 600 # 平均でひらがな1文字1~2トークン、漢字1文字2~3トークンのため、日本語300文字程度と考え600に設定
      }
    )

    @text = response.dig('choices', 0, 'message', 'content')

# 追加
    markdown_html = render_markdown(@text) # マークダウンをHTMLに変換
    render json: { text: markdown_html }
# ここまで
  end

マークダウンの記号のまま出力されていた時は、render json: { text: @text }ようにコードを記載しておりましたが、上記修正を加えることでマークダウン記法が適用されてチャットボットの返答が返ってくるようになっています。

今回はこのように修正しましたが、カスタムヘルパーの本来の使い方を考えてみると正直無理やり書いていおります。
カスタムヘルパーの役割はこちらの記事にも書いてあるとおり、viewで複数使用する可能性のあるコードを、view内で重複して使わないためにメソッド化するためのものです。

カスタムヘルパーの本来の役割としてはviewで使用することが目的のはずなので、コントローラーで使用することは考えられていないはずです。
今回コントローラーで無理やり使用している理由は、view側で一部JavaScriptを使用しており、その中でカスタムヘルパーのメソッドをうまく使用することができず一旦この方法を採用しているという形です。

ただコードの保守性やMVCのそれぞれの役割を考えると良いコードではないので、書き直さなければと思っています。

最後に

今回の内容は、一旦は動いているけど各役割分担から考えるとよくないだろうという内容を記事にしてみました。
プログラミング学習を始めてもう半年経つので、動くコードだけではなくコードの綺麗さも意識して書けるようになりたいです。
最後までご覧いただきありがとうございました。

Discussion