2015-01-23 16 views
8

Với Rails sau 4.2 điều khiển:Đáp ứng với một tình trạng trái phép (401) với Rails 4

class Api::UsersController < ApplicationController 
    def index 
    respond_to do |format| 
     format.html do 
     flash[:error] = 'Access denied' 
     redirect_to root_url 
     end 
     format.json do 
     render json: {}, status: :unauthorised 
     end 
    end 
    end 
end 

Khi, với RSpec 3, tôi cố gắng gọi index hành động này và hy vọng sẽ có tình trạng 401 Tôi luôn luôn có tình trạng 200.

thời điểm duy nhất mà tôi có 401 là để thay thế nội dung index hành động với head 401 nhưng tôi muốn để đáp ứng với lỗi 401 và cũng xây dựng một "nice" cơ thể như { error: 401, message: 'Unauthorised' }.

Tại sao status: :unauthorised bị bỏ qua?

+0

tôi chỉ xây dựng một ứng dụng thử nghiệm nhanh chóng và spec của bạn đi. Nó có thể là một 'before_filter' hoặc' before_action' khác như @shoji gợi ý. –

+0

Tôi gặp vấn đề tương tự với Rails 4.2.0 và Rspec-ray 3.3 – diffeomorphism

Trả lời

5

tôi đã phải thay thế bộ điều khiển của tôi với điều này như sau:

class Api::UsersController < ApplicationController 
    def index 
    respond_to do |format| 
     format.html do 
     flash[:error] = 'Access denied' 
     redirect_to root_url 
     end 
     format.json do 
     self.status = :unauthorized 
     self.response_body = { error: 'Access denied' }.to_json 
     end 
    end 
    end 
end 

Sử dụng render không ngăn được gọi là hành động sẽ được thực hiện. Sử dụng head :unauthorized đang trả về mã trạng thái phù hợp nhưng có một thân trống.

Với self.statusself.response_body nó hoạt động hoàn hảo.

Bạn có thể thấy có một cái nhìn vào mã nguồn đá quý của tôi, nơi tôi có vấn đề này ở đây: https://github.com/YourCursus/fortress

+0

Tôi đã thử điều này, nhưng trạng thái phản hồi vẫn là 200 – diffeomorphism

0

Thay unauthorised bởi unauthorized

+0

Xin lỗi ... tự động sửa lỗi từ OSX. Nó không hoạt động với 'trái phép'. – ZedTuX

+0

Tôi không thực sự hiểu tại sao nó không hoạt động ... Với RSpec tôi đang làm một 'get: index, format:: json' và sau đó' expect (response.status) .to eql (401) 'nhưng tất cả thời gian có 200 mã. – ZedTuX

+0

Bạn sử dụng tập tin spec, yêu cầu, bộ điều khiển, v.v ...? Và, bạn không có 'before_filter' hoặc' before_action' trong 'ApplicationController'? – shoji

6

Sử dụng mã lỗi thay vì tên của nó: render json: {}, status: 401

+0

Cả hai đều tương đương trong Rails, hãy xem [hướng dẫn] (http://guides.rubyonrails.org/layouts_and_rendering.html#the-status-option). Ngoài ra, tổng số ngữ pháp nazi: ['its'] (http://www.its-not-its.info/) –

+0

Tiếng Anh không phải là ngôn ngữ mẹ đẻ của tôi vì vậy tôi sử dụng mã để tránh những sai lầm –

+0

@AlexTonkonozhenko Tôi đã thử điều này và nó không hoạt động. – ZedTuX

Các vấn đề liên quan