我可以在我的网址中输入/account.111或/profile.111。 是否可以阻止rails应用程序接受这些路由?
答案 0 :(得分:2)
当您将模型ID传递给不带参数的Rails路由时,通常会发生这种情况。
accounts_path(@model) vs account_path(@model)
如果使用资源
如果不是这个指示,那么你创建自定义路线就是一个错误。
我认为会发生什么事情会调用to_params(@model),它基本上会给出默认的slug:id。此ID实际上传递给(。:格式)选择器,因此您最终使用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作为格式参数。
答案 1 :(得分:1)
您可以约束格式,这应该有效
get '/account', constraints: { format: 'html' }
但我仍然不确定你想要实现什么目标。为什么有人会为格式编号?
修改
您可以将所有路径放在约束块中,但我认为它并不是真正的智能或有效
constraints: { format: 'html' } do
...
end
答案 2 :(得分: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 Regex Expression以了解它将发送到404的网址。