tutorial rails que ejemplos descargar curso caracteristicas ruby-on-rails ruby http

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)