2009-11-04 12 views
12

Mam witrynę Rails 2.1.2, która ma tylko szablony html, np. jobs.html.erb, więc kiedy poprosić o spokojny zasobu:Metody ograniczania formatu renderowania Railsów do html

www.mysite.com/jobs/1

To czyni moją pracę w HTML, jednak, jeśli żądanie:

www.mysite.com/jobs/1.xml

pojawia się błąd:

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

Co gorsze jest to, że mogę również zażądać coś podobnego

www.mysite.com/jobs/1.xyz

I rzeczywiście widzę błąd:

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

Aby stricly obecny tylko html zawartości, co jest najczystszym i najprostszym sposobem, aby powiedzieć Rails, że nie chcę, aby uczynić coś innego niż pliki .html.erb.

Ważne jest, aby pamiętać, że:

  • Niektóre z moich działań regulatora zawierać połączenia uzależnione od metody render(), podczas gdy inni używają zachowanie domyślne Rails czyli jeśli nie nazywamy render(), a następnie szablon o nazwie youraction.html.erb zostanie wyrenderowany.
  • Mój kod nie używać metody responds_to()

Byłoby wspaniale, jeśli roztwór nie był w tynku/poziom responds_to jak będę musiał zmodyfikować znaczną liczbę działań. Być może istnieje sposób na skonfigurowanie Railsów, aby renderować tylko szablony HTML?

Odpowiedz

7

Jeśli nie chcesz używać responds_to, można to zrobić:

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 

To potrwa, zanim wszystkich żądań i tylko ci, których nie określono formatu w ogóle, albo że określenie formatu HTML, dzięki . Wszyscy inni dostają 404'd. Możesz utworzyć public/406.html, jeśli chcesz zwrócić 406 nie do zaakceptowania.

+1

To faktycznie nie zwraca 404, ale po prostu renderuje '404.html' jako odpowiedź 200. Musisz dodać ': status => 404' (lub': status =>: not_found'). Podobnie, w przypadku 406, będziesz chciał użyć ': status => 406' (lub': status =>: not_acceptable'). – Peeja

+1

To również nie powiedzie się, jeśli żądanie używa nagłówka "accept", aby zażądać typu odpowiedzi, ponieważ nie jest ono przechowywane w params – zimkies

14

W swoich tras można po prostu usunąć wiersz:

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

i „.xyz” nie będą już kierowane, w wyniku błędów 404 /.

+0

Usunięcie tej linii nie rozwiązuje problemu w Railsach 3.2.6: jest już skomentowane, ale nadal pojawia się błąd Brak szablonu. – collimarco

5

Rozwiązanie Bena działa.

Rozważmy jednak rozwiązanie responds_to. Jest czystszy, ponieważ pozwala na elastyczność, gdy nieuchronnie trzeba otworzyć akcję dla wywołania JavaScript json lub xml. Wtedy nie będziesz musiał dodawać osobnika:

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

Ja osobiście lubię blok respond_to; jest bardzo opisowy.

respond_to do |wants| 
    wants.html 
end 

Każdy format niewymienione w bloku będzie automatycznie spowodować HTTP 406 nie do przyjęcia zostać zwrócone. To miłe.

+1

uzgodnione. Blok responds_to otwiera świat elastyczności, a jeśli możesz poświęcić trochę czasu na dodanie .html do każdej z akcji kontrolera, jest to znacznie bardziej przyszłościowe rozwiązanie. – Ben

10

Można użyć funkcji Rails do zastąpienia jednej czynności. Co to jest? -> Jest to również możliwe, aby zastąpić standardową obsługę zasobów przekazując w bloku do respond_with określające, jakie formaty przesłonić dla tego działania:

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 

: z wyjątkiem I: tylko opcje

Można także przekazać w: a oprócz: jedyne opcje tylko do formatów wsparcia dla konkretnych działań (jak to zrobić z before_filter):

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

The dowolnym formacie:

Jeśli nadal chcesz używać respond_to ciągu indywidualnych działań, użyj: dowolny format zasobów, które mogą być wykorzystane jako symbol wieloznaczny meczu przeciwko wszelkim nieokreślonych formatach:

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

To tylko Rails 3. – Jared

+0

Jared, czy mógłbyś bardziej szczegółowo określić, która z trzech opcji jest tylko Rails 3! Używam Rails 2.3.4 i: Każda opcja działa. – leviathan

1

byłem coraz non-sensical wnioski o format obrazu w plikach HTML, wyzwalając 500 z MissingTemplate. I edicted następujące po zakończeniu mojego działania:

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

A teraz zamiast się raporty o błędach, my emitują 406 do tej mischievious żądającego.