微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

ruby-on-rails – 使用to_param为包含分隔符的字段的Rails RESTful资源

我希望我的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变得不开心.我相信这是因为’.’ character在ActionController :: Routing :: SEParaTORS中定义,它列出了用于拆分URL的特殊字符.这允许你做像/websites/1.xml这样的东西.

那么,是否有一种干净的方式允许’.’ RESTful URL中的字符?

我已经尝试重新定义ActionController :: Routing :: SEParaTORS以不包含’.’,这是解决问题的一种非常糟糕的方法.这会通过在其中附加“.:format”来混淆生成的URL.

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

非常感谢 :)
缺口

解决方法

解决了这个问题,非常感谢 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保持一致,因此:不必为网站的所有嵌套路由指定要求.所以我也可以

websites_requirements.resources :accounts
websites_requirements.resources :monthly_bandwidth_records
etc.

原文地址:https://www.jb51.cc/ruby/269988.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐