我可以进入/account。111或/profile。111在我的URL的。是否有可能阻止这些路由被rails应用程序接受?
当您将模型id传递给不带参数的Rails路由时,通常会发生这种情况。
accounts_path(@model) vs account_path(@model)
如果使用资源
如果不是指示性的,说明你在创建自定义路由时犯了一个错误。
我认为它会调用to_params(@model),它基本上会返回默认的:id。这个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
<----- correct
两种情况都要用复数,通常
编辑
我看到了问题:是的,问题是它匹配。111作为格式参数
您可以约束格式,这应该可以工作
get '/account', constraints: { format: 'html' }
但我还是不知道你想达到什么目的。为什么有人会用数字来表示格式?
编辑你可以把所有的路由放在一个约束块中,但我认为这不是很聪明或有效的
constraints: { format: 'html' } do
...
end
在routes.rb
之上添加constraints
block
#config/routes.rb
constraints(EndingWithDigit) do
match '*path' => redirect('/404')
end
现在,在lib/ending_with_digit.rb
上创建EndingWithDigit
类
#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表达式,以知道它将发送哪些url到404。