rails sqliteでのカラム削除の方法

Progate Rails 9章写経中、postsテーブルにuser_idというカラムを追加するとこで詰まったのでメモ。コードは合ってるのにどうも上手く動かんなーと思ってたら、どうやらカラムを追加するテーブルを間違えてたようです。

本来はuser_idというカラムをpostsテーブルに追加するところ、usersテーブルに追加してたようで、一度カラムの削除が必要になりました。

最初はDB側からコマンドで削除しようとしたのですが、SQLiteだとカラムを削除するコマンドが無いようで、テーブルをコピーしたり色々必要そうでめんどくせーとか思ってたら、Rails側でDBいじれるの忘れてました。。Railsすげー。

以下、やり方です。

 

1.ターミナル上で、こちらを入力。

 rails generate migration Removeカラム名Fromテーブル名 カラム名:型名

 (カラム名とテーブル名の先頭は大文字から始める!)

削除するのにgenerate?と違和感を感じますが、あくまでDBを操作するためのmigrationファイルをgenerateするためです。

 

2. rails db:migrateマイグレーションファイルを反映

このコマンドをターミナルで入力することで、さきほどmigrationファイルに書き込んだ変更内容をDBに反映させます。

 

3.完了!!

 

実際に試してみましょう。

赤丸のuser_idが今回消したいカラムです。

f:id:takara1356:20181228015041p:plain

 

ターミナルから、コマンド入力。

f:id:takara1356:20181228015215p:plain

すると、こんなマイグレーションファイルが生成されます。

f:id:takara1356:20181228015513p:plain

なんかいかにも削除してくれそうな感じです。頼もしい。

ちなみに、generateコマンドを入力ミスすると、changeメソッドの中身が空のマイグレーションファイルが生成されるので、一度中身を確認してからdb:migrateするといいかも。

からの、db:migrate。

f:id:takara1356:20181228015341p:plain

これで出来たはず!もう一度DBの中身を確認してみます!

f:id:takara1356:20181228020043p:plain

passwordカラムの横にあったuser_idカラムが消えました!!やったー!!!

比較

変更前:

f:id:takara1356:20181228014719p:plain

変更後:

f:id:takara1356:20181228020043p:plain







 

【エラーの素】Atomで全角スペース探せるよ!

コード書いてると、誰でも一度は全角スペースのせいでエラー起こした経験はあると思います。

特にプログラミングを始めて最初の方だと、スペースが原因でエラーが起きるなんて思わないでしょう。私のAtomは、かな入力モードでバックスペースを2度押すと自動で全角スペースが発生するというクソ素敵仕様で、HTMLがバグ祭りになって、最初はかなり悩まされました。

そして何かエラーが発生するたびに、横矢印キー(→)をひたすらカチカチして探すわけですが、これ、とんでもなく非効率でした。

実はAtomの検索機能で探せるんです。

やり方

Atomを開いてcommand + Fで検索タブを開き、全角スペースを入力する。

おわり。

f:id:takara1356:20181221182619p:plain

適当な行に全角スペースを2つ入れてみましたが、しっかり見つけてくれました!

構文エラーが出たときは一回やってみるといいかもです。

【Railsエラー】 syntax error, unexpected tIDENTIFIER, expecting ')' について

progete7章目を写経中に出てきたエラー、

 syntax error, unexpected tIDENTIFIER, expecting ')' 

↑こいつにちょっとハマったので、解決法をメモ。

f:id:takara1356:20181221180443p:plain

18行目でエラー発生。

上のエラー文でググると、全角スペースが原因で発生することが多いようです。

しかしどこにも全角スペースは見当たらず、、

やっとわかった原因は、17行目最後のカンマ抜けでした。

気づかずにしばらく戦ってました。。ポンコツすぎる...

エラー名にsyntax error(構文エラー)とあるように、前後の行の文法にミスがないか、一度見直したほうが良さそうです。

rails個人的アウトプット インスタンス変数 scaffold db:migrateについて

現在railsの学習を、こちらの教材を使って進めています。

Rails Textbook

進めていてアレッ?となった部分をSinatraと比べたりして自分なりにアウトプット指定効果と思います。

 

・@から始まるアレは何?

f:id:takara1356:20181212010932p:plain

インスタンス変数。コレに入れた値をコントローラからビューへと渡してくれます。

上の画像の@timeですね。

 

f:id:takara1356:20181212011500p:plain
Sinatraでいうと、画像の@res @starと同じ働きをします。

Sinatraだとルーティング内に書いてたものを、railsだとコントローラーに書き込み、それをビューで読み込むっぽいです。

・scaffoldてなんだ

rails初学者向けの教材で序盤に出くわすやつ。「すかふぉるど」と読むらしい。

rails g scaffold book title:string memo:text

このようなコマンドだけで、DBのテーブル構築とかしてくれる...強すぎ...

rails g scaffold モデル名 カラム名:データ型 カラム名:データ型

こんな風に使えます。

Sinatraの時はsequelでひとつひとつ手入力でテーブルを作っていたのですが、コレだと連動するモデルやらコントローラーもまとめて一緒に作ってくれて感動!

ちなみに宣言したモデル名(上のコマンドだとbook)を複数形にして自動でテーブルを作ってくれるぞ!かしこい!

マイグレーションてなんだ

SQLを書くことなく、rubyの分だけでDBのテーブル作成してくれる機能。

ActiveRecordRubyの文をSQLに翻訳してくれてます。

db:migrateを実行することでDBも更新される。

 

プログラミング学習、今のとこの一番の敵はスマブラです。プロコン買っちゃった。

 

自己紹介

はじめまして。沖縄に住んでる大学生のたからと申します。

大学を2年間休学し、フィリピンとカナダに留学に行ったり、バイクで日本一周したりでぶらぶらしてましたが、無事来年からIT系の企業に就職することになりました。

そのため現在プログラミング(主にRails)を勉強中で、そのアウトプットに使っていくつもりです。

 

好きなもの有川浩オーバーウォッチで、苦手なものはパリピテキーラです。

よろしくお願いします。