【问题标题】:My rendering in Rails (possibly) causes a 422 error我在 Rails 中的渲染(可能)导致 422 错误
【发布时间】:2016-12-27 08:16:49
【问题描述】:

我收到了来自我网站的用户报告,他们在使用 POST 访问“结果”页面时遇到错误 422。我根本无法重新创建此错误,因此我想知道下面的代码中是否有任何内容会导致格式错误?我预计这里可能会出现错误,因为我已将 Rails 3.x 项目升级到 Rails 4.2。

我想知道代码中是否有任何明显的东西会产生 422 错误,或者是否有解决 422 错误的方法。

基本上,在#show 中有一个 POST 方法来产生结果。它正在创建一个结果文本并落在 /this-post-name/result?r=abc123 之类的 url 上。我在/result 中渲染#show,因为它基本上再次加载相同的页面,但带有“结果框”。必须使用 /result 是我作为新手程序员所做的选择,我认为并非绝对必要。

我很确定错误存在于“respond_to”中,但无法解决或排除故障(即重新创建它)。

另外,我不确定这是否重要,但我在此页面上收到大量 AuthencityToken 错误。

编辑:我设法通过我的 iPhone 访问它并发布表单来重新创建此问题,然后我禁用了 cookie 并再次发送表单。这不会是人们经常做的事情,但我猜禁用 cookie 可能会导致这种情况?

  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

【问题讨论】:

    标签: ruby-on-rails http-status-code-422


    【解决方案1】:

    A 422 表示无法处理的实体。在您的示例代码中只有一个位置带有此 http 状态代码:

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

    当格​​式为 XML 且 @validator 包含错误时,显然会发生这种情况。

    编辑:

    根据日志中有关异常的新信息和第二个链接的 stackoverflow 问题,它似乎与已知的 Rails issue 相关联

    【讨论】:

    • 嗯,是的,这是真的,但我真的不明白为什么普通用户会遇到这个错误?为什么这个 PUT 请求的正常提交会被解释为 XML?在我的版本中,我删除了这一行,但我无法确认这是否解决了 422 错误。
    • 没有查看代码很难说。我将增强日志记录并跟踪 format.xml { Rails.logger.error "... #{params.inspect}..." } 中的所有参数
    • 实际上,我认为这个问题与protect_from_forgery和禁用cookies的手机有关。这可能与我遇到的另一个问题有关:stackoverflow.com/questions/39055480/…
    【解决方案2】:

    这个问题似乎与to another issue that I have written another question for 有关。据我从http://api.rubyonrails.org/v2.3/classes/ActionController/RequestForgeryProtection/ClassMethods.html 了解到,我的网站存在 InvalidAuthencityToken 问题,并且由此创建的异常会导致 422(而不是 500)错误

    我不能 100% 确定这是同一个问题,但似乎很有可能,因此我将结束这个问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-21
      • 2012-04-27
      • 2012-04-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多