8

我希望我的 Rails 2.3.2 应用程序能够响应并生成如下 URL:

/websites/asd.com
/websites/asd.com/dns_records/new

在我的 config/routes.rb 中,我有:

map.resources :websites, :has_many => :dns_records
map.resources :dns_records, :belongs_to => :website

然后我可以访问以下资源:

/websites/1
/websites/1/dns_records

通过修改我的网站模型,我可以生成更好的 URL,如下所示:

class Website < ActiveRecord::Base
    def to_param
        domain_name
    end
    ...
end

# app/views/websites/index.erb
<% @websites.each do |w| %>
<%= link_to "Show #{w}", website_path(w) %>
<% end %>

# Produces a link to:
/websites/example_without_periods_in_name

但是,对于包含“.”的域名 字符,Rails 变得不高兴。我相信这是因为'.' 字符在 ActionController::Routing::SEPARATORS 中定义,它列出了用于拆分 URL 的特殊字符。这允许您执行 /websites/1.xml 之类的操作。

所以,有没有一种干净的方法来允许'。RESTful URL 中的字符?

我尝试将 ActionController::Routing::SEPARATORS 重新定义为不包含 '.',这是解决问题的完全错误的方法。这会通过向它们附加“.:format”来混淆生成的 URL。

我也知道我可以将 :requirements => { :id => regexp } 添加到我的 config/routes.rb 以匹配包含“。”的域名 (没有这个,params[:id] 被设置为第一个 '.' 之前的域名部分),但这无助于 RESTfully 生成 URL/路径。

非常感谢 :) 尼克

4

3 回答 3

4

解决了这个问题,非常感谢http://poocs.net/2007/11/14/special-characters-and-nested-routes(有关更多信息,请参见http://dev.rubyonrails.org/ticket/6426参考)

我需要为每个嵌套路由添加 :requirements => { :website_id => regexp } ,该路由也将包含一个带有句点的域名。

这是我的工作路线:

map.resources :websites, :requirements => { :id => /[a-zA-Z0-9\-\.]+/ } do |websites|
    websites.with_options :requirements => { :website_id => /[a-zA-Z0-9\-\.]+/ }  do |websites_requirements|
        websites_requirements.resources :dns_records
    end
end

<%= link_to 'New DNS Record', new_website_dns_record_path(@website) %>

# Produces the URL
/websites/asd.com/dns_records/new

呼吁

websites.with_options

只是与 DRY 保持一致,因此不必为网站的所有嵌套路由指定 :requirements。所以我也可以

websites_requirements.resources :accounts
websites_requirements.resources :monthly_bandwidth_records
etc.
于 2009-06-05T00:03:38.670 回答
1

这是一个有趣的问题。如果你'.:format'做一个基本的map.resources. 如果您想要名称中的句点,那么您不符合通常的 rails 样式,并且我认为如果您绝对需要“。” ,则可能需要自定义路线。在网址中。

但是,也许您应该考虑更改to_param. 您对使用以下内容有何看法?

def to_param
   domain_name.sub('.','_dot_')
end

我认为,如果您使用它来管理客户网站,这是一种相当优雅的方式来生成漂亮(和 SEO 友好)的 URL,例如

/websites/asd_dot_com/dns_records/new
/websites/asd_dot_com/
于 2009-06-04T14:56:51.723 回答
0

前段时间我遇到了类似的问题,并得出了类似的解决方案。使用 /.+/ 作为相关参数的要求对我来说效果很好。

http://zargony.com/2009/05/05/routing-parameters-with-a-dot

于 2010-08-04T23:39:25.237 回答