railsの続き

ドツボにハマる。結構ハマるというか勘違い多くて。
  1. ajaxが動かなくてどうも普通の画面遷移になる
これが全くわからなくてずっと悶々としてたんだけど、railsjquery読んでないからだった。 というのもsinatraで書いてた時にjqueryを引っ張ってきてた名残で、こっちにもそのjqueryを引っ張ってた。デフォルトでrailsjqueryが入っていて、なんか挙動がおかしいなと思ったのでデフォルトの方消してたというタコいミス。 formタグのdata-remote="true"って書き方だけでどうしてajaxが動くのか考えれば分かることなんだけどなぁ。
で、デフォルトだけの方で挙動がおかしかったのはjsの読み込みのタイミングの問題だったのか?って感じでちゃんと意識して書いたら動いてたのでまぁ良しとしよう。納得出来ないけど。
  1. js, cssの扱い勘違い
railsからconfig/initializers/asssets.rbに書けって言われたのでその通りにしてたけど、これ全部の画面で読み込んでるじゃんという。結局public/配下において、viewで普通に呼び出すだけで良いらしい。なんでこんなめんどくさいんだとは思った。
  1. テーブルの参照
例えばbookテーブルにauthor_idがあって、authorテーブルのidとauthor_idでパっとauthorテーブルの中身出したいんだけど、関連付けできねーの?って問題。
@book = Book.find(1) Author.find(@book.author_id)
みたいなの毎回書けって?って感じ。bookとauthorの関係分かりづらいし。(そうでもないか) 絶対にこの辺は簡単にやれるようになってるはずなんだよなぁ〜と、思ったらbelongs_toとhas_manyを使えばいいみたいな話が。 つまりこれで
` @book.author
だけでauthor参照できる。Bookのmodelにbelongs_toでauthor登録しておいて(Authorにはhas_manyをつける)、.authorつけるとAuthor.where(id: @book.author_id)をしてくれる。実際.authorつけるタイミングでselect文発行してるっぽいし。これだと圧倒的に分かりやすい。違和感はあるけど。
違和感は「本が所有してる著者」っぽい感じがして逆なんじゃないか感すごいんだよな。@author.bookだと「著者が所有している(書いた)本」で全く違和感ない。こっちの設計おかしいのか理解がおかしいのかどっちもなのか。
一応、[model名]_idがデフォルトの規則らしいけど、modelにforeign_keyとか設定してあげると好き放題な名前がつけられるらしい。そっちもちょっと後でやらないといけないんだけど。ちなみにauthor_idとanother_author_idみたいな感じでやろうとしたら、どうも後のほうのみAuthorのidが入るらしくてそれもハマった。
  1. 配列のidで取り出し?
さっきのbook, authorの例で言うとauthorが複数マッチしてAuthorの配列の帰ってくる状況。 この複数のauthorにマッチするBookを取り出したいがどうするか?
@author.each do |a| @book << Book.where(author_id: a.id) ` end
を、最初思い浮かべたんだけど、これだとRelationにならなくて@bookに対して更に.where()とか使えない。第一ダサい。
後で気づいたけどin句で出せば良いんだよなって感じではあるんだけど、それのrailsでの実現方法がわからなかった。 ググってたらmapでやってる人いたけどそんなバカなwだったんだけど、つまりはfindやwhereに配列で渡すとin句にしてくれるので、mapじゃなくてpluck()ってので配列作って渡せということらしい。
` @book = Book.where(author_id: @author.pluck(:id))
で、"select * from books where author_id in (1,2,3,4)"みたいな一文で済ましてくれる。
  1. formのactionのid
    1. formから"post /search" に飛ぶ。
    2. ページをリンクから移動して"get /search/2?keyword=hoge" に行く
    3. 再度formから"post /search"に飛ぶ
をすると飛び先が"post /search/2"になっている。form_tag action: "search"ってやってるとidも拾って作るらしい。form_tag "/search"って明記してとりあえず解決。
って感じで一通りは機能問題なしかな。 後はチョロチョロ勉強してrailsに合った書き方をもうちょい落とし込みたい。

シンボルの書き方がなぁ。最初「:key => "value"」だろって思ってたんだけど、「key: value」の方がさっと書けていいか。