2014-10-31 51 views
0

我有一個模型,包含我用來確定搜索項的有效性的活動模型驗證...如果我用無效搜索調用我的控制器端點,rails的respond_with將返回200的一個422.respond_with return 200而不是422

如果我binding.pry裏面我的控制器行動,我看到: search_result.valid? =>假

search_result.errors.full_messages => 「姓氏必須至少2個字符」

...那麼,爲什麼我得到一個200?

model: 

    class SearchResult 
     include ActiveModel::Validations 
     validate :ensure_terms_presence_and_length 

     attr_reader :attrs 

     def initialize(attrs = {}) 
     @attrs = attrs 
     end 

     def users 
     valid? ? SearchClient.search(attrs) : [] 
     end 

     private 

     def ensure_terms_presence_and_length 
     if attrs.values.join.blank? 
      errors.add(:base, 'search fields cannot be blank') 
     else 
      attrs.each do |key, value| 
      errors.add(key, 'must be at least 2 characters') if value.length < 2 
      end 
     end 
     end 
    end 

controller: 

    module Api::V1 
     class SearchUsersController < ApiController 
     respond_to :json 

     def index 
      search_result = SearchResult.new(permitted_params) 
      respond_with search_result, serializer: SearchResultSerializer 
     end 

     private 

     def permitted_params 
      params.permit(
      :username, 
      :first_name, 
      :last_name, 
      :email 
     ) 
     end 
     end 
    end 

回答

0

所以經過一些實驗,我發現,只有當出現錯誤時,創建/更新操作實際上會返回422狀態---但是,您仍然需要手動調用.valid?爲了使respond_With返回無效狀態碼+序列化錯誤對象。

如果使用show或index操作,rails不關心有效嗎?並將始終返回200.

0

當響應JSON,Rails的默認爲200,您可以使用if/else語句中指定的結果在你的控制器:

if product.save 
    render json: product, status: 201, location: product 
    else 
    render json: product.errors, status: 422 
end 
+0

我不認爲這是真的..我的其他api控制器處理活動記錄模型作爲資源返回422s時,他們有錯誤。看起來這只是活動模型資源的一個問題。 – patrick 2014-11-01 06:20:49

相關問題