我可以在我的 URL 中输入 /account.111 或 /profile.111。是否可以防止这些路线被 Rails 应用程序接受?
3 回答
当您将模型 id 传递给不带参数的 Rails 路由时,通常会发生这种情况。
accounts_path(@model) vs account_path(@model)
如果使用资源
如果这不是指示性的,那么您在创建自定义路线时犯了一个错误。
我认为它会调用 to_params(@model) 会发生什么,这基本上会返回 :id 的默认 slug。这个 id 实际上是传递给 (.:format) 选择器的,所以你最终会得到 account.111 而不是 accounts/111 或 accounts/111/edit。
get '/accounts/:id(.:format)' => "accounts#show", :as => "edit_account"
如果你称之为edit_account_path(@account)
然而
get '/account', => "accounts#show", :as => "account"
如果您将其称为account_path(@account)
可能会产生/account.111
更可能的原因是你搞砸了多元化。
你有
资源帐户
资源帐户
或者
resources accounts
<-----正确
你通常想在这两种情况下都使用复数
编辑
我看到了问题:是的,问题是它匹配 .111 作为格式参数。
您可以限制格式,这应该可以
get '/account', constraints: { format: 'html' }
但我仍然不确定你想要达到什么目的。为什么有人会输入数字格式?
编辑
您可以将所有路线放在约束块中,但我认为这不是很聪明或有效
constraints: { format: 'html' } do
...
end
只需constraints
在顶部添加块routes.rb
#config/routes.rb
constraints(EndingWithDigit) do
match '*path' => redirect('/404')
end
EndingWithDigit
现在,创建类lib/ending_with_digit.rb
#lib/ending_with_digit.rb
class EndingWithDigit
def self.matches?(request)
path = request.fullpath
if path =~ /^\/[\w]+[.]{1}+[\d]+/
true
else
false
end
end
end
现在,将其包含在config/initializers/
#config/initializers/constraints.rb
require "ending_with_digit.rb"
您可以检查Ruby 正则表达式以了解它将发送到 404 的 url。