预防/帐户.rails应用中的1111路由



我可以进入/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。

最新更新