所以,这确实是一个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
行?
答案 0 :(得分:2)
您可以一次为多个资源提供约束。
scope :constraints => { :id => /\d+/ } do
resources :inbox do
resources :messages
end
end
这对我来说最有意义。您可以在控制器中验证before-filters中的整数,但我认为根据您的情况,这是一个混乱的替代方案。