Sinatra + ActiveRecordでアプリ作るよ
社内勉強会でSinatra + ActiveRecord + vue.jsのタスク管理アプリを作っているので、そこで困ったことのメモ。
今回はSinatra + ActiveRecordのサーバサイド。
このページを参考につくる。
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