2009-11-04 16 views
12

Sadece html şablonları içeren bir Rails 2.1.2 sitesi var. Ben dinlendirici bir kaynak istediğinde jobs.html.erb, yani:Rayları sınırlama yöntemleri html biçiminde biçimlendirme

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

:

www.mysite.com/jobs/1.xml

hata alıyorum: Ben istek halinde

www.mysite.com/jobs/1

Ancak, html işimi vermektedir Daha da kötüsü

Ben de

www.mysite.com/jobs/1.xyz

gibi bir şey isteyebilir ki

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

stricly mevcut sadece html içerik için, ben .html.erb dosyalardan başka bir şey işlemek istemiyorum Rails anlatmak için en temiz ve en basit yolu nedir:

Ve gerçekten ben hatası görebilirsiniz.

O dikkat etmek önemlidir:

  • sen (işlemek çağrı yoksa diğerleri yani varsayılan Raylar davranışı kullanmak iken benim denetleyicisi işlemlerden bazıları render() yöntemine koşullu çağrılarını içeren) daha sonra youraction.html.erb adlı şablon oluşturulacak. Ben eylemlerin önemli sayıda değişiklik yapmak zorunda kalacak kadar
  • Kodum çözüm işlemek/responds_to seviyesinde olmasaydı çok iyi olurdu responds_to() yöntemini

kullanmaz. Belki de sadece html şablonları oluşturulmasını sağlamak için Rails'i yapılandırmanın bir yolu var mı? senin yolları ise

cevap

7

, bunu yapabilirsiniz:

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 

tüm istekler önce çalıştırın ve sadece hiç biçimi belirtmek veya bu aracılığıyla html biçimi belirtmek olmayanları izin vereceksin . Diğerleri 404 olur. 406'yı kabul edilemez duruma getirmek istiyorsanız bir public/406.html oluşturabilirsiniz.

+1

Bu aslında bir 404 döndürmez, ancak 200 yanıt olarak '404.html' oluşturur. ': Status => 404' (veya': status =>: not_found') eklemeniz gerekecek. Benzer şekilde, 406 için ': status => 406' (veya': status =>: not_acceptable') kullanmak istersiniz. – Peeja

+1

Ayrıca, istek yanıt türü istemek için 'kabul' üstbilgisini kullanırsa başarısız olur, çünkü bu, – zimkies

14

sadece çizgiyi kaldırabilirsiniz:

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

Ve ".xyz" artık/404 hatalara neden yönlendirilecektir. Eğer responds_to kullanmak istemiyorsanız

+0

Bu satırın kaldırılması, Rails 3.2.6'daki sorunu çözmez: zaten açıklanmıştır ancak Şablon Eksik hatası hala görünmektedir. – collimarco

5

Ben'in çözümü işe yarıyor. Yine de responses_to çözümünü düşünün. JavaScript json veya xml araması için kaçınılmaz olarak bir eylem açmanız gerektiğinde esnekliğe izin verdiği için daha temizdir. O zaman, kişisel olarak response_to bloğunu eklemem gerekmeyecektir; bu çok açıklayıcı.

respond_to do |wants| 
    wants.html 
end 

blokta belirtilmeyen tüm biçim otomatik iade edilecek Kabul Edilemez bir HTTP 406 neden olacaktır. Bu iyi.

+1

Anlaştıkları param'larda saklanmaz. Response_to bloğu bir esneklik dünyası açar ve denetleyici eylemlerinizin her birine .html için bir tane eklemek için zaman ayırabilirseniz, bu daha ileriye dönük bir çözümdür. – Ben

10

Rails Per-Action Üzerine Yazma özelliğinin üzerine yazabilirsiniz. Bu nedir?

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 

: Sadece Seçenekler

Ayrıca geçebilir: Ve hariç -> O eylem için geçersiz kılmak için biçimlendirir belirterek respond_with bir blokta ileterek standart kaynak kullanımını geçersiz kılmak da mümkündür içinde: hariç ve: belirli eylemler için tek destek biçimlerine sadece seçenekleri (eğer before_filter ile yapmak gibi):

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

: herhangi Biçim

sen hala bireysel eylemlerin içinde respond_to kullanmak istiyorsanız, kullanın: Herhangi belirtilmemiş biçimlerde karşı joker eşleşme olarak kullanılabilecek herhangi bir kaynak biçimi:

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

Bu, yalnızca Rails 3'tür. – Jared

+0

Jared, lütfen üç seçenekten hangisinin Rails 3'ten daha spesifik olduğunu söyler misiniz? Rails 2.3.4 üzerinde çalışıyorum ve: Herhangi bir Seçenek çalışır. – leviathan

1
ben olmayan sensical başlamıştı

HTML dosyalarında resim formatı istemek, MissingTemplate ile bir 500 tetiklemek.

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

Ve şimdi yerine hata raporları alma, bunu yaramaz istekte bulunan kişiye bir 406 yayarlar: Ben eylemin sonuna aşağıdaki edicted.

İlgili konular