2009-11-04 4 views
12

Tengo un sitio de Rails 2.1.2 que solo tiene plantillas html, p. jobs.html.erb, por lo que cuando solicito un recurso reparador:Métodos para limitar el formato de procesamiento de rieles a html

www.mysite.com/jobs/1

Se hace mi trabajo en html, sin embargo, si lo solicito:

www.mysite.com/jobs/1.xml

me sale el error:

Template is missing Missing template jobs/show.xml.erb in view path c:/workspace/mysite/app/views

Lo que es peor es que también puedo pedir algo así como

www.mysite.com/jobs/1.xyz

Y de hecho veo el error:

Template is missing Missing template jobs/show.xyz.erb in view path c:/workspace/mysite/app/views

Para stricly contenido actual sólo HTML, ¿cuál es la manera más limpia y sencilla de decirle a Rails que no quiero para hacer que no sean archivos .html.erb nada.

Es importante tener en cuenta que:

  • Algunos de mis acciones del controlador contienen llamadas condicional al método render(), mientras que otros utilizan el comportamiento por defecto de Rails es decir, si no llamar a render(), entonces la la plantilla llamada youraction.html.erb se representará.
  • Mi código no utilizar el método responds_to()

Sería muy bueno si la solución no estaba en el nivel render/responds_to como tendría que modificar un número significativo de acciones. ¿Quizás hay una forma de configurar Rails para que solo se procesen las plantillas html?

Respuesta

7

Si no desea utilizar responds_to, usted puede hacer esto:

class ApplicationController < ActionController::Base 
    before_filter :allow_only_html_requests 

    ... 

    def allow_only_html_requests 
    if params[:format] && params[:format] != "html" 
     render :file => "#{RAILS_ROOT}/public/404.html" 
    end 
    end 

    ... 

end 

que se ejecutará antes de todas las solicitudes y sólo dejar que aquellos que no especifican el formato en absoluto, o que especifican el formato HTML a través . Todos los demás obtienen 404'd. Puede crear un public/406.html si desea devolver 406 no aceptable.

+1

Eso en realidad no devuelve un 404, sin embargo, simplemente representa '404.html' como una respuesta de 200. Necesitarás agregar ': status => 404' (o': status =>: not_found'). Del mismo modo, para un 406, querrás usar ': status => 406' (o': status =>: not_acceptable'). – Peeja

+1

Esto también falla si la solicitud utiliza el encabezado 'aceptar' para solicitar el tipo de respuesta, ya que no está almacenado en los parámetros – zimkies

14

En sus rutas puede simplemente eliminar la línea:

map.connect ':controller/:action/:id.:format' 

Y el ".xyz" ya no pueden enrutar, lo que resulta en errores 404 /.

+0

Al eliminar esta línea no se resuelve el problema en Rails 3.2.6: ya está comentado pero sigue apareciendo el error de falta de plantilla. – collimarco

5

La solución de Ben funciona.

Considere la solución responde_to, sin embargo. Es más limpio ya que permite flexibilidad cuando inevitablemente tendrá que abrir una acción para una llamada JavaScript json o xml. Entonces no tendrá que agregar

skip_before_filter :allow_only_html_requests, :only => [:show] 

Me gusta personalmente el bloque responder_; es muy descriptivo

respond_to do |wants| 
    wants.html 
end 

Cualquier formato no especificada en el bloque será automáticamente causar un HTTP 406 No Aceptable para ser devueltos. Eso es bueno.

+1

de acuerdo. El bloque responds_to abre un mundo de flexibilidad, y si puede tomarse el tiempo de agregar uno para .html a cada una de las acciones de su controlador, es una solución mucho más progresista. – Ben

10

Puede usar Rails Función Sobreescritura por acción. ¿Qué es esto? -> También es posible omitir el tratamiento de recurso estándar mediante introducción de un bloque de respond_with especificar qué formatos para anular por esa acción:

class UsersController < ApplicationController::Base 

    respond_to :html, :xml, :json 

    # Override html format since we want to redirect to a different page, 
    # not just serve back the new resource 
    def create 
    @user = User.create(params[:user]) 
    respond_with(@user) do |format| 
     format.html { redirect_to users_path } 
    end 
    end 
end 

: excepto Y: Opciones Yo

También se puede pasar en: excepto y: únicas opciones a sólo formatos de apoyo a las acciones específicas (como lo hace con before_filter):

class UsersController < ApplicationController::Base 
    respond_to :html, :only => :index 
    respond_to :xml, :json, :except => :show 
    ... 
end 

El: cualquier formato de

Si todavía desea utilizar respond_to dentro de sus acciones individuales, utilice el: cualquier formato de recurso que puede ser utilizado como un partido de comodín contra cualquiera de los formatos especificados:

class UsersController < ApplicationController::Base 

    def index 

    @users = User.all 

    respond_to do |format| 
     format.html 
     format.any(:xml, :json) { render request.format.to_sym => @users } 
    end 
    end 
end 
+1

Esto es solo Rails 3. – Jared

+0

Jared, ¿podría especificar cuál de las tres opciones es Rails 3 solamente? Me estoy ejecutando en Rails 2.3.4 y la opción: any funciona. – leviathan

1

Me estaba sin sentido solicitudes de formato de imagen en archivos HTML, activando un 500 con MissingTemplate. Me edicted lo siguiente al final de mi acción:

def show 
    # [...] 
    respond_to :html 
end 

Y ahora en lugar de obtener los informes de errores, que emitirá un 406 a la solicitante maliciosa.

Cuestiones relacionadas