Методы ограничения формата рендеринга Rails на html
У меня есть сайт Rails 2.1.2, который имеет только html-шаблоны, например. jobs.html.erb, поэтому, когда я запрашиваю ресурс restful:
www.mysite.com/jobs/1
Он выполняет мою работу в html, однако, если я требую:
www.mysite.com/jobs/1.xml
Я получаю сообщение об ошибке:
Шаблон отсутствует Отсутствует шаблон jobs/show.xml.erb в пути просмотра C:/рабочее пространство/MySite/приложение/просмотров
Что еще хуже, я могу запросить что-то вроде
www.mysite.com/jobs/1.xyz
И действительно, я вижу ошибку:
Шаблон отсутствует Отсутствует шаблон jobs/show.xyz.erb в пути просмотра C:/рабочее пространство/MySite/приложение/просмотров
Чтобы наглядно представить только содержимое html, какой самый чистый и простой способ сказать Rails, что я не хочу отображать ничего, кроме файлов .html.erb.
Важно отметить, что:
- Некоторые из моих действий с контроллером содержат условные вызовы метода render(), в то время как другие используют поведение Rails по умолчанию, то есть если вы не вызываете render(), тогда будет отображаться шаблон с именем youraction.html.erb.
- Мой код не использует метод responses_to()
Было бы здорово, если бы решение не было на уровне render/responses_to, так как мне пришлось бы изменить значительное количество действий. Возможно, есть способ настроить Rails так, чтобы отображались только html-шаблоны?
Ответы
Ответ 1
Если вы не хотите использовать responses_to, вы можете сделать это:
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
Это будет выполняться перед всеми запросами и только те, которые не определяют формат вообще, или которые определяют html-формат. Все остальные получают 404'd. Вы можете создать public/406.html, если хотите вернуть 406 неприемлемым.
Ответ 2
В ваших маршрутах вы можете просто удалить строку:
map.connect ':controller/:action/:id.:format'
И ".xyz" больше не будет маршрутизироваться, что приведет к 404 ошибкам/.
Ответ 3
Вы можете использовать функцию Rails Перенаправление перезапуска. Что это? → Его также можно переопределить стандартную обработку ресурсов, передав в блок response_with указание, какие форматы будут переопределяться для этого действия:
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
: кроме И: только Опции
Вы также можете передать: except и: только опции, поддерживающие только форматы для определенных действий (как вы это делали с before_filter):
class UsersController < ApplicationController::Base
respond_to :html, :only => :index
respond_to :xml, :json, :except => :show
...
end
: любой формат
Если вы все еще хотите использовать response_to в своих индивидуальных действиях, используйте: любой формат ресурсов, который можно использовать в качестве подстановочного знака для любых неуказанных форматов:
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
Ответ 4
Работа Бен работает.
Рассмотрим решение responses_to. Он более чист, поскольку позволяет гибкость, когда вам неизбежно придется открыть действие для вызова JavaScript json или xml. Тогда вам не придется добавлять
skip_before_filter :allow_only_html_requests, :only => [:show]
Мне лично нравится блок reply_to; это очень описательно.
respond_to do |wants|
wants.html
end
Любой формат, не указанный в блоке, автоматически приведет к возврату HTTP 406 Not Acceptable. Это приятно.
Ответ 5
Я получал нечувствительные запросы для формата изображения в файлах HTML, триггер 500 с MissingTemplate
. В конце своего действия я высказал следующее:
def show
# [...]
respond_to :html
end
И теперь вместо получения отчетов об ошибках мы испускаем 406 этого ошибочного реквестера.