2017-04-01 40 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

谢谢。我曾考虑过使用“包含/扩展”,但它似乎不起作用;( –