2017-04-01 37 views
0

我遵循rails約定here:我們不應該直接使用錯誤代碼,而是使用它的符號。例如:Rails:如何包含Rack :: Utils

# bad 
... 
render status: 500 
... 

# good 
... 
render status: :forbidden 
... 

但事實上,這些數字還沒有宣佈呢,所以如果我想用我必須爲使用:

Rack::Utils::SYMBOL_TO_STATUS_CODE[:bad_request] 

這是凌亂。我的問題是:我怎麼能包括/擴展模塊Rake::Utils,所以我只需要使用:bad_request

回答

0

從鐵軌控制檯使用Rails 4.2.5.1,這樣做的:

Rack::Utils::SYMBOL_TO_STATUS_CODE[:bad_request]我得到400

Rack::Utils::SYMBOL_TO_STATUS_CODE。我可以看到所有這些狀態...

{ 
:continue=>100, 
:switching_protocols=>101, 
:processing=>102, 
:ok=>200, 
:created=>201, 
:accepted=>202, 
:non_authoritative_information=>203, 
:no_content=>204, 
:reset_content=>205, 
:partial_content=>206, 
:multi_status=>207, 
:already_reported=>208, 
:im_used=>226, 
:multiple_choices=>300, 
:moved_permanently=>301, 
:found=>302, 
:see_other=>303, 
:not_modified=>304, 
:use_proxy=>305, 
:temporary_redirect=>307, 
:permanent_redirect=>308, 
:bad_request=>400, 
:unauthorized=>401, 
:payment_required=>402, 
:forbidden=>403, 
:not_found=>404, 
:method_not_allowed=>405, 
:not_acceptable=>406, 
:proxy_authentication_required=>407, 
:request_timeout=>408, 
:conflict=>409, 
:gone=>410, 
:length_required=>411, 
:precondition_failed=>412, 
:payload_too_large=>413, 
:uri_too_long=>414, 
:unsupported_media_type=>415, 
:range_not_satisfiable=>416, 
:expectation_failed=>417, 
:unprocessable_entity=>422, 
:locked=>423, 
:failed_dependency=>424, 
:upgrade_required=>426, 
:precondition_required=>428, 
:too_many_requests=>429, 
:request_header_fields_too_large=>431, 
:internal_server_error=>500, 
:not_implemented=>501, 
:bad_gateway=>502, 
:service_unavailable=>503, 
:gateway_timeout=>504, 
:http_version_not_supported=>505, 
:variant_also_negotiates=>506, 
:insufficient_storage=>507, 
:loop_detected=>508, 
:not_extended=>510, 
:network_authentication_required=>511 
} 

我認爲你不需要定義任何新的狀態。 如果需要無論如何做它,你可以使用一個初始化添加:在控制器

/my_app/config/initializers/codes.rb

Rack::Utils::SYMBOL_TO_STATUS_CODE[:my_code] = 666

然後:

class Api::V1::RegionsController < Api::V1::BaseController 
    def index 
    respond_with Region.all, status: :my_code 
    end 
end 

正如您所看到的,我返回了自定義代碼。

postman example returning custom code

+0

謝謝。看起來我們可以直接在控制器內部使用代碼。但是我想在隨機文件中使用':my_code'。具體來說,我想用在從'Grape :: API'擴展的文件中。 –

+0

好吧,這不是問題...我想你可以使用創建自己的方法來使用'Rack :: Utils :: SYMBOL_TO_STATUS_CODE' – Leantraxxx

+0

謝謝。我曾考慮過使用「包含/擴展」,但它似乎不起作用;( –