Как вернуть правильные коды ошибок HTTP из приложения Ruby on Rails

Вы можете просто сделать assert(2 * i != i), который будет вызывать утверждение. Вы можете написать свой собственный класс исключений, если вам нужно что-то более интересное.

29
задан Alexander Savin 3 February 2012 в 14:29
поделиться

5 ответов

Вы должны отобразить страницу с правильным статусом.

render(:file => File.join(Rails.root, 'public/403.html'), :status => 403, :layout => false)
42
ответ дан Sandip Ransing 3 February 2012 в 14:29
поделиться

хорошо, вы можете использовать

:status =>500

Но, по умолчанию Rails позаботится о типе ошибок при рендеринге.

Ошибки страниц по умолчанию находятся в общем каталоге. 500.html, 404.html и т. Д.

Для получения дополнительной информации о :status, как его использовать, нажмите здесь

1
ответ дан Manish Shrivastava 3 February 2012 в 14:29
поделиться

Когда вы просто даете код состояния, а тела нет, удобным способом является

head 403

Этот метод также принимает символические имена для кодов состояния, например

head :forbidden
52
ответ дан Frederick Cheung 3 February 2012 в 14:29
поделиться

Согласно ActionController :: Head docs просто используйте этот шаблон в действиях

  return head([status]) if/unless [some condition here]

Пример:

  return head(:gone) if @record.deleted?
  return head(:forbidden) unless @user.owns?(@record)

return используется для проверки что оставшийся код в действии не будет запущен.

12
ответ дан gertas 3 February 2012 в 14:29
поделиться

Я думаю, у вас есть две проблемы: во-первых, ваша строка @item = Item.find(params[:id]) поднимает 404, и выполнение никогда не достигает того, что предполагалось (оператор if). Во-вторых, вы вызываете исключения и никогда их не ловите. Попробуйте:

def destroy_oauth
   begin
     @item = Item.find(params[:id])
     if(!@item.nil? && @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

Что-то в этом роде, но вы также упомянули, что строите API, поэтому, когда вы исправляете ошибку, вы можете отрендерить xml информацию об ошибке. Что-то вроде:

# 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

Удачи. Udachi.

1
ответ дан Simon Bagreev 3 February 2012 в 14:29
поделиться
Другие вопросы по тегам:

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