1

我可以在我的 URL 中输入 /account.111 或 /profile.111。是否可以防止这些路线被 Rails 应用程序接受?

4

3 回答 3

2

当您将模型 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 作为格式参数。

于 2013-09-02T21:53:06.650 回答
1

您可以限制格式,这应该可以

get '/account', constraints: { format: 'html' }

但我仍然不确定你想要达到什么目的。为什么有人会输入数字格式?

编辑

您可以将所有路线放在约束块中,但我认为这不是很聪明或有效

constraints: { format: 'html' } do
  ...
end
于 2013-06-20T10:21:46.613 回答
0

只需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。

于 2013-09-07T18:42:30.410 回答