Rails routesを書く時の注意点(超基本)
routes.rbを書く時
基本形 (Scaffold準拠にルーティングを追加するとき)
単数なのか複数なのか、注意すること。
- resource
- resources
複数形リソース
一番基本形 (resources) キーワード、リソース名ともに複数形
使用例:
resources :products
生成されるパス
Scaffold基本形と完全一致(7つ)
Prefix Verb URI Pattern Controller#Action products GET /products(.:format) products#index POST /products(.:format) products#create new_product GET /products/new(.:format) products#new edit_product GET /products/:id/edit(.:format) products#edit product GET /products/:id(.:format) products#show PATCH /products/:id(.:format) products#update PUT /products/:id(.:format) products#update DELETE /products/:id(.:format) products#destroy
単数形リソース
どういう時に単数形リソースを使うかの参照記事 Rails のルーティング | Rails ガイド
場合によっては、ユーザーがページを表示する時にidを参照することのないリソースが使用されることがあります。たとえば、/profileでは常に「現在ログインしているユーザー自身」のプロファイルを表示し、他のユーザーidを参照する必要がないとします。このような場合には、単数形リソース (singular resource) を使用してshowアクションに (/profile/:idではなく) /profileを割り当てることができます。
使用例:
resource :profile
生成されるパス (index は生成されない) :idもない
Prefix Verb URI Pattern Controller#Action product POST /product(.:format) products#create new_product GET /product/new(.:format) products#new edit_product GET /product/edit(.:format) products#edit GET /product(.:format) products#show PATCH /product(.:format) products#update PUT /product(.:format) products#update DELETE /product(.:format) products#destroy page GET /pages/*id high_voltage/pages#show
単語の単数形複数形に注意
resource :products
とかやると、意味がわかりにくいので注意。
id指定なしでアクセスできる単数形リソースを作ろうとしている時は、リソース名も単数形にした方がいい。
Scafolldと同じrouting書こうと思ってたのに、何故かindexアクションが生成されてない!?と思ったら、ウッカリ resouce (s忘れ)してないかチェックすること。
Rails で erb -> haml への変換ポイント(どのgemの機能で変換するか)
コメントで教えてもらった
自分の記事に、 erb2haml
の別オプションがあることを教えてもらって、「おお!」と思って調べてみたら、初心者的に混乱した箇所があったのでメモメモ。
元々の手順
erb2haml で変換、してシェルでチマチマ削除してる。
変換
$ bundle exec rake haml:convert_erbs
削除
$ rm app/views/layouts/application.html.erb
教えてもらった手順
gemの提供タスクで、置き換えまでやってくれる方を使う。
$ bundle exec rake haml:replace_erbs
やってみようと思ってハマった件・・
最近勉強を助けるために、RubyMineのお世話になってるので、RubyMineからRakeタスクを実行!
使えるタスクをRubyMineが補完してくれるので、ナイス!と思ってたら・・何故か haml:convert_erbs
も haml:replace_erbs
も出てこない・・・
haml:erb2haml
しかない・・・
そうか!gemが入ってないプロジェクト見てるのかも!
と閃いて、Gemfileを確認すると、やっぱり erb2haml
入ってないプロジェクトだった。
該当のプロジェクトに含まれていた haml 関連の gems
erb2haml入れてみると・・
Gemfileに gem 'erb2haml'
を入れてから、もう一度RubyMine様に聞いてみると・・
おお!!出てきた〜〜♪
別々のgemで同じネームスペース(?)みたいの使ってるってことなのかな。。
難しいな・・この辺コピペしてきたGemfileを入れまくってる初心者的には、どれがどれなのかちゃんと理解してなくてちょっと混乱するポイントかも。
勉強になった。。
黒魔術なgem inherited_resources
Railsのコントローラーに RESTful の基本形コントーローラーメソッドがないのに、create, update, destroyできてる・・
黒魔術的なgem, inherited_resourcesが入っていないか確認する。
gem 'inherited_resources'
これが Gemfile に含まれていて、対象のコントローラーが inherit_resourcesを有効にしている場合、デフォルトの index, new, edit, show, create, update, destroy が省略できるようになっている。
有効にする方法
class ProjectsController < InheritedResources::Base end
または
class ProjectsController < ApplicationController inherit_resources end
対象のコントローラーが、ApplicationController以外を継承してる場合、親のクラスも調べる。 inherit_resources有効なClassを継承していても、やっぱり効いてくるので注意!
inherit_resources で更にアクションをカスタマイズしたい時
inherit_resourcesで追加されるアクションの基本動作はScaffoldの通り。
destroyは対象モデルを削除した後に、そのリソースのindex urlにリダイレクトする。みたいな感じ。
それらの基本動作を上書きしたい場合、 ! をつけたアクション名で呼び出す。
やり方はこんな感じ。
class ProjectsController < ApplicationController inherit_resources def show show! do |format| format.html { render "edit" } end end def destroy destroy! { root_url } end end
カスタマイズしているアクションの動作
- showのrenderするテンプレートをeditにしている
- destroyした後のリダイレクト先をリソースのindexではなく、アプリケーションのルートURLにしている
defaultsでデフォルト動作をフックする
class ProjectsController < ApplicationController inherit_resources defaults finder: :find_by_name end
findのidで探すところを、モデルの find_by_name で代替するように指定したりできちゃう。らしい。
注意点
このgemはもうあまり使われていないらしい。 元リポジトリのREADMEでも一番最初に Deprecation notice が書かれているので、今から新しく使うことはしないほうが良さげ。
I suggest developers to make use of Rails' respond_with feature alongside the responders gem as a replacement to Inherited Resources.
と書いてあるので、respond_with でフォーマットの指定ができるようになったので、標準の方を使ったほうが良い、らしい。
とはいえ、見かけたソースに 標準アクションがないのに、なんか動作してるけど!?という時に、原因を見つけるために知っておいた方が良い、くらいの位置づけっぽいです。
今週のRails勉強記録と目標
今週は簡単なRailsアプリを素早く作る練習を再開。
コード書き始めたら、アレコレ地味に落とし穴に落ちて、いろいろと勉強になった!
先週入れたdebug力向上のためのgem(ツール類)が大活躍♪
目標は2週間で前回のコピーアプリくらいを作りたかったんだけど、1週間経った時点でかなりまだまだな感じ。。 相変わらずスピードに難あり。
Devise & OmniAuth (with Github) で予想してた以上に苦戦
あと、初めてOmniAuthをやってみたので、週の前半はそこにほとんど時間を取られてしまった・・
Devise & OmniAuth は、たくさん紹介記事とかもあるし、すぐできるかな〜と高をくくっていたけど、意外と苦戦・・ 最初に参考にした情報がOmniAuth ( Deviseなし ) だったので、読み替えがうまくできてなくてハマった・・
OmniAuthで参考になったページ
最終的にここのページの通りにやればよかった。。
Perfect RailsでOmniAuthやってる箇所と、RailsCastの簡単なOmniAuthの説明ページの内容を合わせながらやったところ、情報が古かった&Deviseとの連携がなかった、で無理やり読み替えしながらやったら、グチャグチャになってしまった。。
やはり公式を見るのが一番・・・(英語も普通に読みやすかった・・)
最初におもいっきり注意書きがあって、
Remember that config.omniauth adds omniauth provider middleware to your application. This means you should not add this provider middleware again in config/initializers/omniauth.rb as they'll clash with each other and result in always-failing authentication.
意訳:config.omniauth
が middleware を追加するので、config/initializers/omniauth.rb
で middleware の定義しちゃダメ!
って書いてある。。RailsCastとか、ちょっと古い情報だと、middleare定義するように書いてある文書があるので、一番最初に注意書きしてあるみたい。 読み飛ばし、ダメ;;
ちゃんと理解した!と思った Rails で Ajax の書き方でハマった・・
理解した!と思って、先週記事を書いた Ajax の扱いについて、何故か意図通りいかない事象に遭遇・・
結局ファイルのパスを間違えていた(途中でnamespaceに移動させたりしてるうちに、残念な状態になってた)だけだったのに、気づくまでにかなりの時間がかかってしまった。。
Railsでは「お約束の場所」「お約束の名前」からズレてしまうと大きな痛手を受ける。。
こういうロスタイムいかんなぁ。。
こっちも、もうちゃんと理解した!と思ってた partial の書き方でハマった・・・・
何が元々の形で、どう省略を許されているのか、という理解が足りなかった。。 これも発見までに地味に時間がかかってしまった。
Railsでは「よく使うパターンなので省略を許している」オプションが出てくることが多い。
しかも適当に情報を集めてると、
- もともとの形
- 省略が許されているからそうなっている形
- 普段あまり使わないオプションが入ってきた場合の形
の、どの状態なのかわからないまま使っていることになったりする。
これを意識して調べておかないと、省略形が元々の形だと思って、むやみにオプションだけを追加したら、動きません!状態になってしまう。
目標
いつも使うお約束のgemやRailsの機能を、イチイチ調べずにスラスラ書けるようになりたい。。
今週のRuby, Railsの勉強
今週はあんまり新しい知識を得た感がない・・けど、なんとか2記事Rails関連をQiitaに投稿。
まとめ記事1
おすすめされて既に知っていたgemである、BetterErrorsだが、知らなかった事2点発見があった。
BetterErrorsの新発見
- エディタ設定をしておくと、ブラウザからファイルパスをクリックすると、該当のソースコードを開いてくれる
- Ajax Request時で、エラー見れないじゃん;;と泣く泣くコンソールログを見ていたが、実は実行後に別の画面に遷移してしまったあとでも、
http://localhost:3000/__better_errors
と打ち込むと、最後のエラー画面を見せてくれる
2個目のAjax Requestでもデバッグ助けてくれる、というのに感動!
RailsPanel
Chromeの拡張で、ブラウザ上からいい感じにトレースが見れる。
たしかどっかでチラッと見かけたような気がするけど、ちゃんと導入してなかった。 コレはかなり便利そう♪
まとめ記事2
RailsでAjax書く時の基本的な流れをまとめた。 多分先月のコピーアプリ作成時にまとめかけて、完成しないまま放置してたっぽい。
その他
全然Rails関係ないけど・・・
このところ、AngularJSをやっている。。 JavaScript恐るべしなコールバック地獄・・・ たかだかファイルシステムからファイル取り込んで、表示するだけで、何回コールバック関数書くのよ;;
格闘の末のCordova File APIを使ってファイルシステムにアクセスして、最後の最後に処理を一回挟むコードに成功。
ちょっとだけ Promise とやらの使い方が分かった気がする。 ・・・が、まだ胸を張って「Promiseあーね!」とは言えない;; まだまだまだまだ。。である。