区切り文字を含むフィールドに to_param を使用する Rails RESTful リソース

StackOverflow https://stackoverflow.com/questions/948886

  •  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/

私も少し前に同様の問題を抱えていて、同様の解決策にたどり着きました。問題のパラメータの要件として /.+/ を使用すると、私にとってはうまくいきました。

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top