区切り文字を含むフィールドに to_param を使用する Rails RESTful リソース
-
09-09-2019 - |
質問
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
ただし、「。」を含むドメイン名の場合キャラクター、レールは不幸になります。これは「。」だからだと思います。文字は、ActionController :: Routing :: Separatorsで定義されています。これは、URLを分割する特殊文字をリストします。これにより、/websites/1.xml などの操作が可能になります。
したがって、「」を許可するクリーンな方法はありますか。安らかなURLの文字?
「.」を含めないように ActionController::Routing::SEPARATORS を再定義しようとしましたが、これは問題を解決する完全に悪い方法です。これにより、生成された URL に「.:format」が追加され、URL が台無しになります。
また、config/routes.rbに追加できることも知っています。 (これがなければ、params [:id]は最初のドメイン名の一部に設定されます '。')が、これは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 に準拠しているため、Web サイトのすべてのネストされたルートに対して :requirements を指定する必要はありません。だから私もそうすることができました
websites_requirements.resources :accounts
websites_requirements.resources :monthly_bandwidth_records
etc.
他のヒント
これは興味深い問題です。悪いものを取り除くことはできないと思います '.: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/
私も少し前に同様の問題を抱えていて、同様の解決策にたどり着きました。問題のパラメータの要件として /.+/ を使用すると、私にとってはうまくいきました。