Методы для ограничения направляющих представляют формат к HTML

Наиболее распространенное (согласно моим ненаучным наблюдениям) сценарий мертвой блокировки DB очень просто:

  • Два процесса читают что-то (запись DB, например), оба получают коллективную блокировку на связанном ресурсе (обычно страница DB),
  • Обе попытки сделать обновление, пытаясь обновить их блокировки до эксклюзивных - вуаля, мертвая блокировка.

Этого можно избежать путем определения пункта "FOR UPDATE" (или подобный, в зависимости от конкретного RDBMS), если чтение должно сопровождаться обновлением. Таким образом, процесс получает монопольную блокировку от запуска, делая вышеупомянутый сценарий невозможным.

12
задан Tetsuo 4 November 2009 в 00:51
поделиться

4 ответа

Если вы не хотите использовать responseds_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. Вы можете создать общедоступный / 406.html, если хотите вернуть 406 неприемлемо.

7
ответ дан 2 December 2019 в 04:02
поделиться

В ваших маршрутах вы можете просто удалить строка:

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

И ".xyz" больше не будет маршрутизироваться, что приведет к 404 ошибкам /.

14
ответ дан 2 December 2019 в 04:02
поделиться

Ben's solution works.

Consider the responds_to solution, though. It's cleaner since it allows flexibility when you will inevitably need to open up an action for a JavaScript json or xml call. Then you won't have to add

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

I personally like the respond_to block; it's very descriptive.

respond_to do |wants|
  wants.html
 end

Any format not specified in the block will automatically cause a HTTP 406 Not Acceptable to be returned. That's nice.

5
ответ дан 2 December 2019 в 04:02
поделиться

Вы можете использовать функцию Rails Per-Action Overwrite . Что это? -> Также можно переопределить стандартную обработку ресурсов, передав блок в response_w, указав, какие форматы следует переопределить для этого действия:

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 And: only Options

Вы также можете передать: except и: only параметры чтобы поддерживать форматы только для определенных действий (как вы делаете с before_filter):

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

Формат: any

Если вы все еще хотите использовать 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
10
ответ дан 2 December 2019 в 04:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: