Sinatra + ActiveRecordでアプリ作るよ

社内勉強会でSinatra + ActiveRecord + vue.jsのタスク管理アプリを作っているので、そこで困ったことのメモ。
今回はSinatra + ActiveRecordのサーバサイド。

qiita.com

このページを参考につくる。

SQLite3::CantOpenException: unable to open database file

$ bundle exec rake db:migrate
rake aborted!
SQLite3::CantOpenException: unable to open database file
...

DBのファイルが開けない。
ぐぐったらファイルやディレクトリのパーミッション周りが怪しいとあったので変えてみるも通らない。
パスの指定がおかしいのかな?と疑い出す。

berofe models/todo.rb

ActiveRecord::Base.establish_connection('sqlite3:///todo.db')
class Todo < ActiveRecord::Base
end

after models/todo.rb

ActiveRecord::Base.establish_connection(
  adapter: 'sqlite3',
  database: 'todo.db'
)
class Todo < ActiveRecord::Base
end

establish_connectionはハッシュで書く方法とURLで書く方法がある。
establish_connection (ActiveRecord::Base) - APIdock

DBのファイル作成

$ sqlite3 todo.db

このあたりをやってみたらふと成功。

$ bundle exec rake db:migrate
== 20180201054009 CreateTodos: migrating ======================================
-- create_table(:todos)
   -> 0.0021s
== 20180201054009 CreateTodos: migrated (0.0022s) =============================

書き方変えたからなのか、DBファイルを事前に作っておかなきゃいけないのか…。
理由がわからなかったのでまた今度試してみる。

Encoding::UndefinedConversionError - "\xE7" from ASCII-8BIT to UTF-8:

sinatraのほう
文字コードの変換に失敗。paramsで受け取った値に文字コード指定すると直る。

str.force_encoding('utf-8')

でOK
force_encoding (String) - Rubyリファレンス
パラメータ受け取った時に毎回これやるのはどうなのっていう話はある。うーん

When assigning attributes, you must pass a hash as an argument

これもsinatra

エラーメッセージをちゃんと読むとハッシュで渡すようにと言っているので、変更する

todo = Todo.new(params[:name])

todo = Todo.new(name: params[:name])

エラーメッセージをぐぐるとこういう記事が出てくるので、時勢に乗り遅れていた説…
rails5.2への準備を整える - Qiita