Мой рендеринг в Rails (возможно) вызывает ошибку 422

ruby-on-rails http-status-code-422

1147 просмотра

2 ответа

Я получил сообщения от пользователей на мой веб-сайт, что они получают ошибку 422 при посещении страницы «результатов» с помощью POST. Я не могу воссоздать эту ошибку вообще, поэтому мне интересно, есть ли в моем коде что-нибудь, что могло бы вызвать эту ошибку при форматировании? Я ожидаю, что здесь могут быть ошибки, так как я обновил проект Rails 3.x до Rails 4.2.

Я либо хотел бы знать, есть ли в коде что-то очевидное, что могло бы создать ошибки 422, или есть ли возможность устранить ошибки 422.

По сути, в #show есть метод POST для получения результата. Он создает текст результата и попадает на URL-адрес, как / this-post-name / result? R = abc123. Я рендерил #show в / result, потому что он в основном загружает ту же страницу снова, но с «полем результатов». Необходимость использовать / результат - это выбор, который я сделал как программист-новичок, и я думаю, что он не является абсолютно необходимым.

Я совершенно уверен, что ошибка находится в пределах «response_to», но не могу понять это или устранить ее (то есть пересоздать ее).

Кроме того, я не уверен, если это важно, но я получаю тонны ошибок AuthencityToken на этой странице.

Изменить: мне удалось воссоздать эту проблему, получив доступ к нему через мой iPhone и опубликовать форму, затем я отключил куки и снова отправить форму. Это не было бы чем-то, что люди делали бы часто, но я предполагаю, что отключенные куки могут вызвать это?

  def show    
        @avaliable_posts = Post.where(:available => true)
  end


  def result    
    if request.get? && params[:r].blank? # Just visiting /result withoutout POST or ?r url
      redirect_to category_path(@category)      
    else
        set_round(session[:round_by_number])          

      # Either the visitor just posted the result or is revisiting through URL    
      if !params[:r].blank? # Visitor arrived from URL
        @result = Result.find_by_scrambled_identifier(params[:r])
        params_to_use = @result.params_used
        @params_to_use = @result.params_used
      else
        params_to_use = params  
        @params_to_use = params_to_use        
      end

      post_instance = @post.get_post_instance(params_to_use)     

      if post_instance.valid?     

        @post_result_array = post_instance.calculate_me(params_to_use)
        @post_result_text_array = @post_result_array[0]


        respond_to do |format|        
          format.html { render :action => "show" }
          format.json { render :json => @post }
        end

      else # post not valid
        @errors = post_instance.errors

        respond_to do |format|        
          format.html { render :action => "show" }
          format.xml  { render :xml => @validator.errors, :status => :unprocessable_entity }
          format.json { render :json => @post }
        end
      end  
    end     
  end
Автор: Christoffer Источник Размещён: 08.11.2019 10:59

Ответы (2)


1 плюс

422 означает необработанный объект. В вашем примере кода есть только одно место с таким кодом статуса http:

 format.xml  { render :xml => @validator.errors, :status => :unprocessable_entity }

Очевидно, это происходит, когда формат XML и @validatorсодержит ошибку.

Редактировать:

С новой информацией об исключении в журналах и вторым связанным вопросом о переполнении стека это, похоже, связано с известной проблемой Rails

Автор: slowjack2k Размещён: 20.08.2016 10:15

0 плюса

Кажется, что эта проблема связана с другой проблемой, для которой я написал другой вопрос . У меня есть проблема InvalidAuthencityToken с моим веб-сайтом, и исключения, созданные в результате этого, вызывают ошибку 422 (а не 500), насколько я понимаю из http://api.rubyonrails.org/v2.3/classes/ActionController/RequestForgeryProtection/ ClassMethods.html

Я не уверен на 100%, что это та же самая проблема, но она кажется вполне вероятной, и поэтому я закрою этот вопрос.

Автор: Christoffer Размещён: 20.08.2016 03:27
Вопросы из категории :
32x32