Подтвердить что ты не робот

Методы ограничения формата рендеринга 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-шаблоны?

4b9b3361

Ответ 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 этого ошибочного реквестера.