분리기 문자가 포함 된 필드에 TO_PARAM을 사용한 Rails Restful Resources

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

  •  09-09-2019
  •  | 
  •  

문제

Rails 2.3.2 앱에 응답하고 URL을 생성하기를 원합니다.

/websites/asd.com
/websites/asd.com/dns_records/new

내 config/lours.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

그러나 ''도메인 이름의 경우. 캐릭터, 레일은 불행 해집니다. 나는 이것이 '.'때문이라고 믿는다. 문자는 ActionController :: 라우팅 :: 분리기에서 정의되어 URL을 켜질 특수 문자를 나열합니다. 이를 통해 /websites/1.xml과 같은 작업을 수행 할 수 있습니다.

그래서 ''허용하는 깨끗한 방법이 있습니까? 편안한 URL의 문자?

ActionController :: 라우팅 :: 분리기를 포함시키지 않도록 재정의하려고 시도했습니다. 이렇게하면 ". : 형식"을 추가하여 생성 된 URL을 엉망으로 만듭니다.

또한 다음을 추가 할 수 있다는 것을 알고 있습니다. 요구 사항 => {: id => regexp} config/lours.rb에 '포함 된 도메인 이름과 일치합니다.' (이 없이는 Params [: id]가 첫 번째 ''이전 도메인 이름의 일부로 설정되어 있지만 URL/경로를 편안하게 생성하는 데 도움이되지 않습니다.

많은 감사 :) Nick

도움이 되었습니까?

해결책

큰 감사로 문제를 해결했습니다 http://poocs.net/2007/11/14/special-characters-and-nested-routes (그리고 봐라 http://dev.rubyonrails.org/ticket/6426 추가 참조)

다음을 추가해야했습니다. 요구 사항 => {: 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

단순히 건조 상태를 유지하여 : 웹 사이트의 모든 중첩 경로에 요구 사항을 지정할 필요는 없습니다. 그래서 나는 또한 가질 수있었습니다

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

다른 팁

이것은 흥미로운 문제입니다. 나는 당신이 나쁜 것을 제거 할 수 있다고 생각하지 않습니다 '.:format' 기본을 수행하면 끝까지 추가되었습니다 map.resources. 이름의 기간을 원한다면, 당신은 일반적인 레일 스타일에 따르지 않으며, 당신이 절대적으로 당신이 맞춤형 경로가 순서대로있을 수 있다고 생각합니다. 필요 '.' URL에서.

그러나 아마도 당신은 당신의 정의를 바꾸는 것을 고려해야 할 것입니다. to_param. 다음을 사용하는 것에 대해 어떻게 생각하십니까?

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

고객 웹 사이트를 관리하기 위해 이것을 사용한다면, 멋진 (그리고 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