Marchan4
@Marchan4 (Marchan4)

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

Ruby言語:プログラムとデータベースが連携したWebアプリケーション上で、データベースに保存された書籍の題名データが表示されない。

使用環境はrubyバージョン3.0.0, mysqlバージョン5.7, mysql2バージョン0.5.3, bundlerバージョン2.2.3です。
使用機器macOS Big Sur バージョン11.2.2です。使用中のテキストエディタはAtomです。

mysql2バージョン0.5.3がインストールされた時のメッセージが以下の通りです。

$ sudo gem install mysql2 -v '0.5.3' --source 'https://rubygems.org/' -- --with-cppflags=-I/usr/local/opt/openssl@1.1/in
clude --with-ldflags=-L/usr/local/opt/openssl@1.1/lib

Password:
Building native extensions with: '--with-cppflags=-I/usr/local/opt/openssl@1.1/include --with-ldflags=-L/usr/local/opt/openssl@1.1/lib'
This could take a while...
Successfully installed mysql2-0.5.3
Parsing documentation for mysql2-0.5.3
Done installing documentation for mysql2 after 0 seconds
1 gem installed

$ bundle install

Using bundler 2.2.3
Using mysql2 0.5.3
Following files may not be writable, so sudo is needed:
  /Users/ユーザ名/.rbenv/versions/3.0.0/lib/ruby/gems/3.0.0/build_info
/mysql2-0.5.3.info
Bundle complete! 1 Gemfile dependency, 2 gems now installed.
Use `bundle info [gemname]` to see where a bundled gem is installed.

今、データベースに保存された書籍の題名データを表示するbooklistというWebアプリケーションを作成させていただいており、肝心なデータベースに保存された書籍の題名データを表示させて頂くことができない上にbookilistというWebアプリケーションが起動しませんでした。

そのbooklistというWebアプリケーションのソースコードが以下の通りです。

booklist/views/booklist.erbは以下の通りです。

<html lang="ja">
  <head>
    <meta charset="utf-8">
    <title>Booklist</title>
  </head>
  <body>
<%# フォームデータ送受信確認用コード(本番では削除) %>
<div style="background-color: skyblue;">
<p>動作確認用: <%= params %></p>
</div>
    <a href="/"><h1>Booklist</h1></a>
    <h2>書籍の登録フォーム</h2>
    <form action="/" method="POST">
      <input type="text" name="book_title" placeholder="書籍タイトルを入力" required>
      <input type="submit" name="submit_add_book" value="登録">
    </form>
    <h2>登録された書籍一覧</h2>
    <ul>
      <%# <% @records.each do |record| %> %>←コメントアウトされたため表示されない
       <%# <li><%= ERB::Util.html_escape(record['book_title']) %></li> %>←コメントアウトされたため表示されない
      <%# <% end %> %>←コメントアウトされたため表示されない
    </ul>
  </body>
</html>

booklist/app.rbは以下の通りです。

require 'sinatra'
require 'mysql2'

get '/' do
  client = Mysql2::Client.new(host: 'localhost', username: 'root', database: 'booklist', encoding: 'utf8')
  @records = client.query("SELECT * FROM books ORDER BY created_at DESC")
  erb :booklist
end

post '/' do
  client = Mysql2::Client.new(host: 'localhost', username: 'root', database: 'booklist', encoding: 'utf8')

  # 書籍タイトルの保存
  book_title = params['book_title']
  statement = client.prepare('INSERT INTO books (book_title) VALUES(?)')
  statement.execute(book_title)

  # 書籍タイトルの一覧取得
  @records = client.query("SELECT * FROM books ORDER BY created_at DESC")

  erb :booklist
end

booklist/create_table_booklist.sqlは以下の通りです。

CREATE TABLE booklist.books (
  id INT AUTO_INCREMENT NOT NULL PRIMARY KEY,
  book_title VARCHAR(100),
  created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
);

以下がbooklistデータベースのbooksテーブルのデータ(レコード)です。

mysql> SELECT * FROM books;
+----+-----------------------------------------------------------+---------------------+
| id | book_title                                                | created_at          |
+----+-----------------------------------------------------------+---------------------+
|  1 | 非エンジニアのためのプログラミング講座                    | 2021-03-17 14:16:40 |
|  2 | プログラミングRuby                                        | 2021-03-17 14:17:30 |
|  3 | 入門HTML5                                                 | 2021-03-17 14:18:12 |
+----+-----------------------------------------------------------+---------------------+
3 rows in set (0.01 sec)

あとコメントアウトさせて頂いたソースコードは以下の通りです。

booklist/views/booklist.erbの19行目から21行目

<%# <% @records.each do |record| %> %>
 <%# <li><%= ERB::Util.html_escape(record['book_title']) %></li> %>
<%# <% end %> %>

上記のソースコードをコメントアウトさせて頂いたら、データベースに保存された書籍の題名データが表示しないもののbooklistというWebアプリケーションが起動しました。

逆に上記のコメントアウトされたソースコードから<%# %>の部分を外させて頂いたらbooklistというWebアプリケーションが起動しない上に、データベースに保存された書籍の題名データが表示されませんでした。

0

1Answer

多分ruby3はrbenv使ってインストールしていますよね?
rbenv下でのgemインストールは基本sudoが要らないはずです。でも最初に

$ sudo gem install mysql2 -v '0.5.3 ...

とやっていますよね?なので、bundle時に

$ bundle install

Using bundler 2.2.3
Using mysql2 0.5.3
Following files may not be writable, so sudo is needed:

書き込み権限がないからメッセージが表示されていますよね?
(sudoで最初にインストールしているんで、書き込み権限がrootになってる、その上で一般ユーザー権限で同じ場所を書き込もうとしてるんで、メッセージが表示される)

これがmysql gemなんでデータベース絡みの操作をしようとするとうまく動かないのではないかと。

sudo gem uninstall mysql2
bundle install

として、sudoでインストールしてしまったmysql gemを一旦削除してしまって、ちゃんと一般ユーザーでbundleしたらうまく動きませんか?

0Like

Your answer might help someone💌