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

Web サイト モデルを変更することで、次のようなより良い 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 のようなことができます。

SO、「。」を許可するクリーンな方法はありますか RESTful URL の文字?

ActionController::Routing::SEPARATORS を「.」を含めないように再定義しようとしましたが、これは問題を解決するにはまったく悪い方法です。これは、生成された URL に ".:format" を追加することでめちゃくちゃになります。

:requirements => { :id => regexp } を config/routes.rb に追加して、「.」を含むドメイン名に一致させることもできます。(これがないと、params[:id] はドメイン名の最初の '.' の前の部分に設定されます)、これは URL/パスを RESTful に生成するのに役立ちません。

どうもありがとう:) ニック

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

Web サイトのすべてのネストされたルートに対して :requirements を指定する必要がないように、単純に DRY に準拠しています。だから私も持つことができました

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

これは興味深い問題です。'.:format'基本的なmap.resources. 名前にピリオドが必要な場合は、通常の Rails スタイルに従っていません。絶対に「.」が必要な場合は、カスタム ルートが適していると思います。URLで。

ただし、 の定義を変更することを検討する必要があるかもしれませんto_param。以下を使用することについてどう思いますか?

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

これを使用して顧客のWebサイトを管理している場合、次のような素敵な(そして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 に答える