Rails教程 - 添加图像上传验证时,在开发过程中重新输入异常错误

时间:2016-11-06 05:23:38

标签: ruby-on-rails ruby amazon-web-services heroku development-environment

更新 今天早上我注意到以下列表在heroku日志中稍微高一点:

excon.error.response
2016-11-06T18:17:48.973789+00:00 app[web.1]:   :body          => "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Error><Code>AuthorizationHeaderMalformed</Code><Message>The authorization header is malformed; the region 'us-east-1' is wrong; expecting 'us-west-1'</Message><Region>us-west-1</Region><RequestId>...</RequestId><HostId>...</HostId></Error>"

:region => ENV[’S3_REGION’]添加到我的雾凭据,然后在命令行运行heroku config:set S3_REGION=us-west-1后,图片上传正在生产中!所以大约一半的问题都解决了 - 我仍然完全不明白为什么创建动作在生产和开发中都会引起我的问​​题 - 特别是考虑到两种环境的完全不同的配置。我怀疑,在开发过程中,if @micropost.save导致了问题,因为在亚马逊的Web服务中,错误被删除了几层。我对这个问题没有一个明确的答案,但我会将其标记为已解决 - 实际上,它是。

我即将结束迈克尔·哈特尔的Ruby on Rails教程,就在我实现图像上传到用户微博的最后,我收到了一个非常神秘的错误:异常重新进入。

似乎认为问题出在我的微动作控制器下的创建动作中:

 def create
    @micropost = current_user.microposts.build(micropost_params)
    if @micropost.save
      flash[:success] = "Micropost created!"
      redirect_to root_url
    else
      @feed_items = []
      render 'static_pages/home'
    end
  end
...
  private

  def correct_user
    @micropost = current_user.microposts.find_by(id: params[:id])
    redirect_to root_url if @micropost.nil?
  end  

具体来说,它会突出显示if @micropost.save行。

现在,在网上找到一些帮助之后,我使用了我的基本粘贴 - 迈克尔代码 - 代码 - 技术,令人惊讶的是,我得到了错误消失。我把它缩小到微博模型,这会导致一个问题:

class Micropost < ApplicationRecord
  belongs_to :user
  default_scope -> { order(created_at: :desc) }
  mount_uploader :picture, PictureUploader
  validates :user_id, presence: true
  validates :content, presence: true, length: { maximum: 140 }
  validate  :picture_size

  private

   # Validates the size of an uploaded picture.
   def picture_size
    if picture.size > 5.megabytes
      errors.add(:picture, "should be less than 5MB")
    end
   end
end

这不是:

class Micropost < ApplicationRecord
  belongs_to :user
  default_scope -> { order(created_at: :desc) }
  mount_uploader :picture, PictureUploader
  validates :user_id, presence: true
  validates :content, presence: true, length: { maximum: 140 }
  validate  :picture_size

  private

    # Validates the size of an uploaded picture.
    def picture_size
      if picture.size > 5.megabytes
        errors.add(:picture, "should be less than 5MB")
      end
    end
end

这是缩进问题吗?我不知道。无论如何,所以我继续使用亚马逊网络服务和heroku进行部署,我遇到了另一个错误,我的heroku日志中的这个条目突然出现了:

2016-11-06T04:53:11.814607+00:00 app[web.1]: F, [2016-11-06T04:53:11.814544 #10] FATAL -- : [...]   
2016-11-06T04:53:11.814575+00:00 app[web.1]: ):
2016-11-06T04:53:11.814575+00:00 app[web.1]:   :status_line   => "HTTP/1.1 403 Forbidden\r\n"
2016-11-06T04:53:11.814662+00:00 app[web.1]: F, [2016-11-06T04:53:11.814615 #10] FATAL -- : [...] app/controllers/microposts_controller.rb:7:in `create'

所以我不能只是擦干净双手然后继续前进。这构成了我的问题: - 宽泛地说,什么是“异常重新进入”错误? - 我的缩进理论合理吗? - 我知道如何解决这个问题。

非常感谢你,我很绿,所以如果你需要更多的信息,请告诉我(如果这是一个愚蠢的错误,请耐心等待)。

作为参考,完整的微博控制器:

class MicropostsController < ApplicationController
  before_action :logged_in_user, only: [:create, :destroy]
  before_action :correct_user,   only: :destroy

  def create
    @micropost = current_user.microposts.build(micropost_params)
    if @micropost.save
      flash[:success] = "Micropost created!"
      redirect_to root_url
    else
      @feed_items = []
      render 'static_pages/home'
    end
  end

  def destroy
    @micropost.destroy
    flash[:success] = "Micropost deleted"
    redirect_to request.referrer || root_url
  end

  private

  def micropost_params
    params.require(:micropost).permit(:content, :picture)
  end

  def correct_user
    @micropost = current_user.microposts.find_by(id: params[:id])
    redirect_to root_url if @micropost.nil?
  end  

end

1 个答案:

答案 0 :(得分:0)

更新今天早上我注意到以下列表在heroku日志中稍微高一点:

excon.error.response
2016-11-06T18:17:48.973789+00:00 app[web.1]:   :body          => "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Error><Code>AuthorizationHeaderMalformed</Code><Message>The authorization header is malformed; the region 'us-east-1' is wrong; expecting 'us-west-1'</Message><Region>us-west-1</Region><RequestId>...</RequestId><HostId>...</HostId></Error>"

:region => ENV[’S3_REGION’]添加到我的雾凭据后,然后运行heroku config:在命令行设置S3_REGION=us-west-1,图片上传正在生产中!所以大约一半的问题都解决了 - 我仍然不完全理解为什么创建动作在生产和开发中都会引起我的问​​题 - 特别是考虑到两种环境的完全不同的配置。我怀疑,在开发过程中,if @micropost.save导致了问题,因为在亚马逊的Web服务中错误被删除了几层。我对这个问题没有明确的答案,但我会将其标记为已解决 - 实际上,它是。