2014-10-31 7 views
0

У меня есть модель с активной проверкой модели, которую я использую, чтобы определить достоверность поисковых терминов ... Если я вызову конечную точку контроллера с недопустимым поиском, рельсы reply_with вернут 200 вместо of 422.response_with return 200 вместо 422

Если я обязывающ.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

Таким образом, после некоторых экспериментов я обнаружил, что только действия create/update будут возвращать статус 422 при наличии ошибок. Однако вам все равно придется вручную вызывать .valid? для того, чтобы response_With вернуть этот недопустимый код состояния + объект сериализованных ошибок.

Если вы используете действия шоу или индекса, рельсы не заботятся о действии? и всегда будет возвращать 200.

0

При ответе на JSON, Rails по умолчанию в виде 200. Вы можете указать результат в контроллере, используя, если/другое заявление:

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

Я не думаю, что это правда. Мои другие контроллеры api, имеющие дело с активными моделями записей, как ресурсы возвращают 422s, когда у них есть ошибки. Похоже, что это только проблема с активными ресурсами модели. – patrick

Смежные вопросы