【问题标题】:Rails RESTful resources using to_param for a field that contains separator charactersRails RESTful 资源将 to_param 用于包含分隔符的字段
【发布时间】:2010-10-31 05:42:06
【问题描述】:

我希望我的 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] 被设置为第一个 '.' 之前的域名部分),但这无助于 RESTful 生成 URL/路径。

非常感谢 :) 尼克

【问题讨论】:

    标签: ruby-on-rails rest separator


    【解决方案1】:

    解决了这个问题,非常感谢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.
    

    【讨论】:

      【解决方案2】:

      这是一个有趣的问题。如果您执行基本的map.resources,我认为您无法摆脱附加到末尾的坏'.:format'。如果您想要名称中的句点,那么您不符合通常的 rails 样式,我认为如果您绝对 需要 '.',则可能需要自定义路由。在网址中。

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

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

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

      /websites/asd_dot_com/dns_records/new
      /websites/asd_dot_com/
      

      【讨论】:

        【解决方案3】:

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-11-28
          • 2015-11-01
          • 1970-01-01
          • 1970-01-01
          • 2012-01-05
          • 1970-01-01
          相关资源
          最近更新 更多