在rails应用程序中阻止/account.1111路由?

时间:2013-06-19 09:16:16

标签: ruby-on-rails ruby-on-rails-3 routing

我可以在我的网址中输入/account.111或/profile.111。 是否可以阻止rails应用程序接受这些路由?

3 个答案:

答案 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的网址。