在'#show'操作中过滤/验证ID的最佳方法是什么?

时间:2011-09-28 16:09:23

标签: ruby-on-rails ruby-on-rails-3 validation routes

所以,这确实是一个Rails模式问题。

我有一个适用的Rails 3.0.9应用程序。我们使用Airbrake来检测和报告错误,这有助于调整程序设计中的最后几个漏洞。

只是,现在它受到输入错误的机器人(Google,抓取工具等)的攻击。

ActiveRecord::StatementInvalid: PGError: ERROR: invalid input syntax for integer: 
"google_ads_dbg" LINE 1: ....message_thread_id WHERE "message_threads"."id" = 
'google_ad... ^ : SELECT "message_threads".* FROM "message_threads" INNER JOIN    
"message_thread_users" ON "message_threads".id = "message_thread_users".message_thread_id 
WHERE "message_threads"."id" = 'google_ads_dbg' AND (("message_thread_users".user_id = 
33899)) LIMIT 1

宁静的路线:

resource :inbox do
  resources :messages
end

MessagesController#show的第一行

@message_thread = current_user.message_threads.find(params[:id])

我是否为每个.find params[:id]调用添加前缀以验证输入的整数?我是否将:constraints => {:id => /[0-9]+/}添加到我的routes.rb中的每个resource行?

1 个答案:

答案 0 :(得分:2)

您可以一次为多个资源提供约束。

scope :constraints => { :id => /\d+/ } do
  resources :inbox do
    resources :messages
  end
end

这对我来说最有意义。您可以在控制器中验证before-filters中的整数,但我认为根据您的情况,这是一个混乱的替代方案。