Наиболее распространенное (согласно моим ненаучным наблюдениям) сценарий мертвой блокировки DB очень просто:
Этого можно избежать путем определения пункта "FOR UPDATE" (или подобный, в зависимости от конкретного RDBMS), если чтение должно сопровождаться обновлением. Таким образом, процесс получает монопольную блокировку от запуска, делая вышеупомянутый сценарий невозможным.
Если вы не хотите использовать 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 неприемлемо.
В ваших маршрутах вы можете просто удалить строка:
map.connect ':controller/:action/:id.:format'
И ".xyz" больше не будет маршрутизироваться, что приведет к 404 ошибкам /.
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.
Вы можете использовать функцию 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