RailsでURLパラメータにactionが存在したときの対処方法
Railsで、URLパラメータにactionという名前が使われていると、controllerのactionと名前がかぶってしまって、うまくルーティングができなくなります。もちろん、そんな名前のパラメータを使わなきゃいいんだけど、昔のシステムでそんなURLを使っていて変更できないときなんかは困ったことになります。
そんな場合は、config/routes.rbで
map.connect ":controller/:method_name/:id", :controller => "Sample", :action => "router"
みたいな感じにして、SampleControllerで
def router
if request.url =~ /\?.*action=([^&]+)&*/
@param_action = $1
end
if self.public_methods(false).delete_if{|a| a == "router"}.include?(params[:method_name])
eval(params[:method_name])
else
(エラー処理)
end
end
としてやれば、とりあえずなんとかなります。他にもっといい方法があるかもしれません。