Paradigm Shift Design

ISHITOYA Kentaro's blog.

routesで引数の設定

メモその2


すごく簡単なことなのかもしれないけれど、

/contents/upload?user_id=1

というURLにしたい場合に、routes.rbで

map.resources :contents
map.upload '/contents/upload', 
             :controller => 'contents', 
             :action => 'new'

とすると、

Unknown action
No action responded to show

といわれる。これは、/contents以下に対するリクエストをmap.resourcesががんばって勝手に生成してくれてしまっているためみたいで、 ActiveResourceとかそのルーティングとかのドキュメント - moroの日記あたりが参考になる。

ので、どうしてもnewじゃなくてuploadにしたい場合は、

map.resources :contents
map.upload '/upload', 
             :controller => 'contents', 
             :action => 'new'

と、contentsをはずせばいい。


で、user_idを渡す場合に、

map.upload '/upload', 
            :controller => 'contents', 
            :action => 'new', 
            :user_id => /\d+/

とか、何かを参考に書いたら、

<%= link_to "Upload content", upload_url(:event_id => @event.id) %>

とすると、

TypeError in Events#show 
Showing events/show.html.erb where line #28 raised: 

can't convert Fixnum into String

といわれてしまう。意味わからないので苦し紛れに

map.upload '/upload', 
            :controller => 'contents', 
            :action => 'new'

と、指定している部分を消したら動いた。
ちなみに

map.upload '/upload?event_id=:event_id', 
            :controller => 'contents', 
            :action => 'new', 
            :event_id => /\d+/

は動くけど、望むURLにはならない。


見る人が見るとおかしなことをやってるんだろうな・・・