que - Cómo devolver códigos de error HTTP correctos desde la aplicación Ruby on Rails
ruby on rails tutorial (5)
Tengo la aplicación web RoR 3.0 que actúa como proveedor de API de OAuth. Ahora, en API me gustaría devolver códigos de error HTTP correctos al consumidor de API. ¿Cómo hago esto?
Aquí está el ejemplo:
def destroy_oauth
@item = Item.find(params[:id])
if([email protected]? && @item.user_id == current_user.id)
@item.destroy
respond_to do |format|
format.js
format.xml
end
else
raise ActionController::RoutingError.new(''Forbidden'')
end
end
Entonces, en caso de error, estoy intentando devolver el código 403 Prohibido. Aún así, cuando ejecuto esto, siempre obtengo 404 No encontrado devuelto. ¿Cómo devuelvo el código correcto?
¿O es esto algo configurable del servidor web?
Creo que tiene dos problemas aquí: primero es que su línea @item = Item.find(params[:id])
está aumentando 404 y la ejecución nunca llega a donde estaba previsto (declaración if
). Lo segundo es que estás generando excepciones y nunca las atrapas. Tratar:
def destroy_oauth
begin
@item = Item.find(params[:id])
if([email protected]? && @item.user_id == current_user.id)
@item.destroy
respond_to do |format|
format.js
format.xml
end
else
raise ActionController::RoutingError.new(''Forbidden'')
end
rescue ActiveRecord::ResourceNotFound
redirect_to :action => ''not_found'', :status => 404 # do whatever you want here
rescue ActionController::RoutingError
redirect_to :action => ''forbidden'', :status => 403 # do whatever you want here
end
end
Algo así, pero también mencionó que está creando la API, por lo que cuando esté rescatando el error, es posible que desee procesar la información de error xml
. Algo como:
# in application_controller.rb
rescue_from ActionController::RoutingError, :with => :render_forbidden_error
private
def render_forbidden_error(e)
render :status => e.status, :xml => e
end
Buena suerte. Udachi.
Cuando solo está dando un código de estado y no hay cuerpo, una forma conveniente es
head 403
Este método también acepta los nombres simbólicos de los códigos de estado, como
head :forbidden
De acuerdo con ActionController :: Head docs solo usa este patrón en las acciones
return head([status]) if/unless [some condition here]
Ejemplo:
return head(:gone) if @record.deleted?
return head(:forbidden) unless @user.owns?(@record)
return
se utiliza para asegurarse de que no se ejecutará ningún código restante en la acción.
Debes renderizar la página con el estado correcto.
render(:file => File.join(Rails.root, ''public/403.html''), :status => 403, :layout => false)
bueno, puedes usar
:status =>500
Pero, en forma predeterminada, Rails se encarga de la representación del tipo de error.
Las páginas predeterminadas de errores están en el directorio público. 500.html, 404.html etc ..
Para más información sobre :status
, cómo usarlo, haga clic aquí.