2013-04-29 48 views
0

我的rails應用程序有一個json api。 在此api上的操作可能會返回錯誤。我目前使用的是這樣的:在Rails應用中放置控制器助手類的地方

respond_with({:success=>false, :message=>"error_message"}, :status=>400, :location=>nil) 

控制器

我想使這個更好。因此,我決定創建一個錯誤類,它的看法,所以我可以做這樣的事情在控制器:

error.new({message=>"my message", :status =>400}) 

render error 

我的問題是。我應該在哪裏放置ApiError課程?

我不喜歡把它放在models文件夾中,因爲它是api控制器的幫手。不是一般的應用程序模型。

回答

2

我的應用程序命名空間類似這樣,並把它放在lib/my_app/。例如,如果您的應用程序是FooBar我有一個文件夾lib/foo_bar/api和定義在lib/foo_bar/api/error.rb類作爲

class FooBar::Api::Error 
    # ... 
end 

這可以用FooBar::Api::Error.new(...)

如果你選擇走這條路線被調用,你需要添加lib/config.autoload_pathsconfig/application.rb

config.autoload_paths += Dir["#{config.root}/lib"] 

你知道我怎麼能讓render error代碼返回錯誤狀態碼?不使用(:status => error.status)

當然,但就我所知,你不能只是通過error。你不得不調用像

error = FooBar::Api::Error.new({ message: "Some error message" }, status: :bad_request) 

render *error.to_a 

那麼你必須在FooBar::Api::Error

class FooBar::Api::Error 
    def initialize(data={}, options={}) 
    @data = data 
    @options.reverse_merge! status: 200 
    end 

    def to_a 
    [@data, @options] 
    end 
end 

定義to_a方法當你調用error.to_a你會得到其中將包含列表的Array的參數傳遞給render。上面渲染線上的*是Splat操作符(瞭解更多here),將數組展開爲參數列表以傳遞到render,而不是將整個返回的數組作爲第一個參數。

+0

你知道我怎麼能讓「渲染錯誤」代碼返回錯誤狀態碼?不使用(:status => error.status) – Mateu 2013-04-30 09:01:19

+0

我已經更新了我的答案,以正確的方向碰撞你。 – deefour 2013-04-30 11:38:16

+0

完美!謝謝 – Mateu 2013-05-02 08:48:13

相關問題