Carriles recursos REST utilizando to_param para un campo que contiene caracteres de separación

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

  •  09-09-2019
  •  | 
  •  

Pregunta

Quiero que mis Rails 2.3.2 aplicación para responder y generar URL, así:

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

En mi config / routes.rb, que tengo:

map.resources :websites, :has_many => :dns_records
map.resources :dns_records, :belongs_to => :website

A continuación, puede acceder a recursos tales como:

/websites/1
/websites/1/dns_records

Al modificar mi modelo de página web, que puede generar mejores direcciones URL, así:

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

Sin embargo, para los nombres de dominio que contenga ''. personajes, rieles obtiene infeliz. Creo que esto es debido a que la ''. carácter se define en ActionController SEPARADORES :: :: enrutamiento, que enumera caracteres especiales para dividir la URL sucesivamente. Esto le permite hacer cosas como /websites/1.xml.

Entonces, ¿hay una forma limpia para permitir ''. caracteres en las URL REST?

He intentado redefinir ActionController :: :: enrutamiento separadores para no incluir '', que es totalmente una mala manera de resolver el problema. Esta meta la pata URL generadas añadiendo ":. Formato". Les

también sé que puedo agregar: requisitos => {: id => expresión regular} '' a mi config / routes.rb para que coincida con un nombre de dominio que incluye (Sin esto, params [: id] '' se ajusta en la parte del nombre de dominio antes de la primera)., Pero esto no ayuda en la generación de direcciones URL / caminos REST

Muchas gracias :) Nick

¿Fue útil?

Solución

solucionado el problema, con un gran agradecimiento a http: //poocs.net/2007/11/14/special-characters-and-nested-routes (y ver http://dev.rubyonrails.org/ticket/6426 para referencia adicional)

Yo tenía que añadir: requisitos => {: website_id => expresión regular} para cada ruta anidado que también se va a incluir un nombre de dominio con períodos en el mismo.

Aquí está mi ruta de trabajo:

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

La llamada a

websites.with_options

es simplemente de acuerdo con SECO de manera que: requisitos no tienen que ser especificados para todas las rutas anidadas para los sitios web. Así que también podría tener

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

Otros consejos

Este es un tema interesante. No creo que usted puede deshacerse de la mala '.:format' añade al final si lo hace un map.resources básica. Si quieres períodos en los nombres, usted no está de acuerdo con los estilos carriles habituales, y creo que una ruta personalizada podría estar en orden si es absolutamente NECESIDAD el '' en la URL.

Sin embargo, tal vez usted debería considerar la posibilidad de cambiar su definición de to_param. ¿Qué le ocurra usar el siguiente?

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

Creo que, si usted está usando esto para administrar sitios web de los clientes, es una forma bastante elegante para generar buenos (y SEO amigable) URLs como

/websites/asd_dot_com/dns_records/new
/websites/asd_dot_com/

Yo tenía un problema similar hace algún tiempo y llegué a una solución similar. Usando /.+/ como el requisito para el parámetro en cuestión funcionó bien para mí.

http://zargony.com/2009/05 / 05 / enrutamiento de parámetros-con-a-punto

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top