2014/03/27

Ruby on Railsのルーティングがうまく動かなかったのはどう考えても俺が悪い

サーバメンテナンスの管理ツールとして久々にRailsで組んでみた。

が、前にもハマった気がする点にまたハマる程度には忘れていたので、
忘れないように備忘録エントリを作成する。

けど多分また忘れるんだろうな。。。



コントローラーアクションに単純なCRUDからちょい離れる作業を
GETメソッドでトリガーされるように追加しました。

routesにも書きました。

が、うまく動かずRuntime Errorになります。
各アイテムの状態変化(shanaiok, shanaing)を行なったあと、
一覧に戻るようにredirect_toを指定しているにも関わらず動かない。

routes.rbの内容:
OreApp::Application.routes.draw do
  resources :services

  get 'services/:id/normal' => 'services#normal'
  get 'services/:id/maint' => 'services#maint'

  get 'services/shanaiok' => 'services#shanaiok'
  get 'services/shanaing' => 'services#shanaing'

  root 'services#index'
end

rake routesの結果:
$ rake routes
           Prefix Verb   URI Pattern                    Controller#Action
         services GET    /services(.:format)            services#index
                  POST   /services(.:format)            services#create
      new_service GET    /services/new(.:format)        services#new
     edit_service GET    /services/:id/edit(.:format)   services#edit
          service GET    /services/:id(.:format)        services#show
                  PATCH  /services/:id(.:format)        services#update
                  PUT    /services/:id(.:format)        services#update
                  DELETE /services/:id(.:format)        services#destroy
                  GET    /services/:id/normal(.:format) services#normal
                  GET    /services/:id/maint(.:format)  services#maint
services_shanaiok GET    /services/shanaiok(.:format)   services#shanaiok
services_shanaing GET    /services/shanaing(.:format)   services#shanaing
             root GET    /                              services#index

なんで言うこときかねーんだー!
…と悩むこと30分ほど。
  • なぜかredirect_toを指定しているのに#showアクションに渡される。
  • :idに"shanaiok"とか渡される。
routesを見比べてからふと気づく。
あ、優先順位じゃん、と。

アクションで渡したいのに"shanaiok"自体が:idに渡されているのは
上の方にあるservices#showが拾っているからですね。
ルーティングは上から解釈され分岐していくものなのです。


修正後のroutes.rb:
OreApp::Application.routes.draw do

  get 'services/shanaiok' => 'services#shanaiok'
  get 'services/shanaing' => 'services#shanaing'

  resources :services
  get 'services/:id/normal' => 'services#normal'
  get 'services/:id/maint' => 'services#maint'

  root 'services#index'
end

rake routesの結果:
$ rake routes
           Prefix Verb   URI Pattern                    Controller#Action
services_shanaiok GET    /services/shanaiok(.:format)   services#shanaiok
services_shanaing GET    /services/shanaing(.:format)   services#shanaing
         services GET    /services(.:format)            services#index
                  POST   /services(.:format)            services#create
      new_service GET    /services/new(.:format)        services#new
     edit_service GET    /services/:id/edit(.:format)   services#edit
          service GET    /services/:id(.:format)        services#show
                  PATCH  /services/:id(.:format)        services#update
                  PUT    /services/:id(.:format)        services#update
                  DELETE /services/:id(.:format)        services#destroy
                  GET    /services/:id/normal(.:format) services#normal
                  GET    /services/:id/maint(.:format)  services#maint
             root GET    /                              services#index

前にも引っかかったことがあり、学習能力がないようです俺。。 orz


そして極めつけには、routes.rbの初期ファイル内コメントに
# The priority is based upon order of creation: first created -> highest priority.
# See how all your routes lay out with "rake routes". 
…って書いてあるわけで、読まずにコメント捨てた俺はもっとダメ。

2014/03/19

WindowsServer 2008 のタスクスケジューラで 2147943645 エラーでタスク起動不良

ここんとこ、Windowsサーバと格闘しておりました。


デイリーのバックアップ用のジョブをタスクスケジューラ上で作成して、
テスト実行すると問題なく起動するくせに、いざとなったらエラーが出ている。

タスクスケジューラは、ユーザー "<ユーザ名>" の "\<タスク名>" タスクを開始できませんでした。追加データ エラー値: 2147943645

なんじゃこれー。

…と思ったら、ユーザがログインしていない場合にジョブが実行できないとのこと。

ということで、ジョブのプロパティ内にある
  • ユーザがログオンしているかどうかにかかわらず実行する
にチェックを入れればOKというお話でした。


勝手に入れられたタスクジョブの実行回避というセキュリティ上の話からだと思うけど、
ログインしっぱなしというのは逆にセキュリティ的におかしくないすかね。

「タスクの実行時に使うユーザアカウント」情報を保持している割に
ログオン時のみ実行がデフォルトってのもなんだかなぁ、と思うのですが。。。

さらにはコンフィグミスで発生しうる内容なんだからコード返答じゃなくて
ちゃんと発生した事由を喋ってくれよー……と。


75%ほど愚痴でしたw