Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 如何处理Rails中的eval nil问题_Ruby On Rails_<img Src="//i.stack.imgur.com/RUiNP.png" Height="16" Width="18" Alt="" Class="sponsor Tag Img">elasticsearch_Amazon S3_Eval_Ruby On Rails 5 - Fatal编程技术网 elasticsearch,amazon-s3,eval,ruby-on-rails-5,Ruby On Rails,elasticsearch,Amazon S3,Eval,Ruby On Rails 5" /> elasticsearch,amazon-s3,eval,ruby-on-rails-5,Ruby On Rails,elasticsearch,Amazon S3,Eval,Ruby On Rails 5" />

Ruby on rails 如何处理Rails中的eval nil问题

Ruby on rails 如何处理Rails中的eval nil问题,ruby-on-rails,elasticsearch,amazon-s3,eval,ruby-on-rails-5,Ruby On Rails,elasticsearch,Amazon S3,Eval,Ruby On Rails 5,我在生产环境中遇到了一个相当严重的错误,造成了一些混乱。我增加了生产日志记录以缩小问题范围,现在可以在本地环境中重现它。因此,我们在Rails 5上运行,在Ubuntu机器上运行。该应用程序使用ElasticSearch5.4,我们将图像存储在AmazonS3上 过程:用户可以上传图像。Elasticsearch中有一个用户索引,它还将信息存储到相关照片模型中 问题是,一旦用户上传照片,有时会在索引页或详细用户页上出现错误,其中照片以某种方式被访问。要显示的结果不是从数据库读取的,而是Elast

我在生产环境中遇到了一个相当严重的错误,造成了一些混乱。我增加了生产日志记录以缩小问题范围,现在可以在本地环境中重现它。因此,我们在Rails 5上运行,在Ubuntu机器上运行。该应用程序使用ElasticSearch5.4,我们将图像存储在AmazonS3上

过程:用户可以上传图像。Elasticsearch中有一个用户索引,它还将信息存储到相关照片模型中

问题是,一旦用户上传照片,有时会在索引页或详细用户页上出现错误,其中照片以某种方式被访问。要显示的结果不是从数据库读取的,而是Elasticsearch

解决方法(不是其中之一)。一旦索引被重新导入,错误就不再发生了——这让我开始相信它与ElasticSearch有关

用户模型

class User < ApplicationRecord
      include UserSearchable

  extend FriendlyId
  require "redis"
  friendly_id :slug_candidates, use: :slugged

  has_many :photos

  after_update { self.photos.each(&:touch) }

  ...
class Photo < ApplicationRecord
  include ImageUploader[:image]
  include ActiveModel::Validations

  acts_as_taggable

  before_create :set_name

  belongs_to :user, touch: true

  after_update { self.user(&:touch) }

  private

    def set_name
      self.name = "Photo"
    end
end
class用户
结束

用户可搜索关注点

模块用户可搜索 扩展ActiveSupport::关注点

  included do
    include Elasticsearch::Model
    include Elasticsearch::Model::Callbacks

    index_name Rails.application.class.parent_name.underscore
    document_type self.name.downcase

    settings index: { number_of_shards: 1 } do
      mapping dynamic: false do
        indexes :description, analyzer: 'english'
        indexes :tagline, analyzer: 'english'
        indexes :username
        ...
      end
    end

    after_touch() { __elasticsearch__.index_document }

    def as_indexed_json(_options = {})
      self.as_json(
          except: [:email, :lat, :lng, :status, :termsofuse, :v_code],
          include: {
              photos: { only: [:name, :caption, :active, :image_data, :downloadable, :uploader_id, :public] },
      ).merge(
          location: {lat: lat.to_f, lon: lng.to_f},
          age: birthday.nil? ? 18 : ((Date.today - birthday.to_date) / 365.25).floor
      )
    end

    def home_search(searcher, order = nil, how_many = nil)
      how_many = 400 unless how_many.is_a?(Integer)
      order = 1 unless order.is_a?(Integer)

      if self.radius < 30
        use_radius = 30
      else
        use_radius = self.radius
      end

      search_definition = Jbuilder.encode do |json|
        json.sort do
          if order == 1
            json.array! [{'_geo_distance' => { :location => {:lat => lat, :lon => lng} }}, '_score']
          else
            json.array! ['_score', {'_geo_distance' => { :location => {:lat => lat, :lon => lng} }}]
          end
        end
        json.query do
          json.bool do
            json.filter do
              json.bool do
                json.must do
                  json.array! [:geo_distance => { :distance => use_radius, :unit => "mi", :location => {:lat => self.lat, :lon => self.lng}, :boost => 5.0}]
                end
                ...
                unless searcher.id.nil?
                  json.must_not do
                    json.array! [ {:term => { 'id' => self.id }} ]
                  end
                end
              end
            end
            ...
          end
        end
        # json.size how_many
      end


      self.class.__elasticsearch__.search(search_definition)
    end
  end
end
包括您自己
包含Elasticsearch::Model
包括Elasticsearch::Model::回调
索引名称Rails.application.class.parent\u name.下划线
文档类型self.name.downcase
设置索引:{u碎片的数量:1}do
动态映射:false do
索引:描述,分析器:“英语”
索引:标语,分析器:“英语”
索引:用户名
...
结束
结束
在\u touch()之后{uuuuuu elasticsearch\uuuuuu.index\u document}
def as_index_json(_options={})
self.as_json(
除了:[:电子邮件,:lat,:lng,:status,:termsofuse,:v_代码],
包括:{
照片:{only:[:name,:caption,:active,:image_data,:downloadable,:uploader_id,:public]},
).合并(
地点:{lat:lat.to_f,lon:lng.to_f},
年龄:生日.nil±18:((Date.today-Birth.to_Date)/365.25)。楼层
)
结束
def home_search(搜索者,顺序=nil,数量=nil)
how_many=400,除非how_many.是一个?(整数)
order=1,除非order.is_是?(整数)
如果自半径小于30
使用半径=30
其他的
使用_半径=自半径
结束
search_definition=Jbuilder.encode do|json|
json.sort-do
如果订单==1
json.array![{''u geo_distance'=>{:location=>{:lat=>lat,:lon=>lng}}},''u score']
其他的
json.array![''u score',{''u geo'u distance'=>{:location=>{:lat=>lat,:lon=>lng}}]
结束
结束
json.query do
json.booldo
json.filter-do
json.booldo
json.com必须这样做
json.array![:geo_distance=>{:distance=>use_radius,:unit=>“mi”,“location=>{:lat=>self.lat,:lon=>self.lng},:boost=>5.0}]
结束
...
除非searcher.id.nil?
json.must\u不能这样做
json.array![{:term=>{'id'=>self.id}]
结束
结束
结束
结束
...
结束
结束
#json.size有多少个
结束
self.class.\uuuu弹性搜索\uuuuu.search(搜索定义)
结束
结束
结束
照片模型

class User < ApplicationRecord
      include UserSearchable

  extend FriendlyId
  require "redis"
  friendly_id :slug_candidates, use: :slugged

  has_many :photos

  after_update { self.photos.each(&:touch) }

  ...
class Photo < ApplicationRecord
  include ImageUploader[:image]
  include ActiveModel::Validations

  acts_as_taggable

  before_create :set_name

  belongs_to :user, touch: true

  after_update { self.user(&:touch) }

  private

    def set_name
      self.name = "Photo"
    end
end
班级照片
控制台中的问题测试:

这里,这是问题的关键。如果我对照片进行评估,有时是零,有时不是!我不知道为什么?如果我在控制台上运行这个命令10次,那么10次中有2次是零。也就是说,当生产系统偏离其轨道时,用户会看到一个错误系统是内联网,而且是新的,我们实际上向用户显示异常(所以不要因为错误的异常处理而惊慌-如果您不清楚,用户不会说任何话;)

>eval(user.photos.sample.image\u数据)[:small][:id]
=>“photo/47/image/small-2cd0928d02826f0614086a01ee97ef32.jpg”
>>eval(user.photos.sample.image_数据)[:small][:id]
!! #
>>eval(user.photos.sample.image_数据)[:small][:id]
=>“photo/47/image/small-2cd0928d02826f0614086a01ee97ef32.jpg”
>>eval(user.photos.sample.image_数据)[:small][:id]
=>“photo/47/image/small-2cd0928d02826f0614086a01ee97ef32.jpg”
>>eval(user.photos.sample.image_数据)[:small][:id]
=>“photo/47/image/small-2cd0928d02826f0614086a01ee97ef32.jpg”
>>eval(user.photos.sample.image_数据)[:small][:id]
=>“photo/47/image/small-2cd0928d02826f0614086a01ee97ef32.jpg”
>>eval(user.photos.sample.image_数据)[:small][:id]
!! #
>>eval(user.photos.sample.image_数据)[:small][:id]
!! #
>>user.photos.sample.image\u数据
“照片/47/图像/原始-47/图像/照片/图像/原始-47/47/图像/图像/图像/原始-114C9DB7555b25afe395555555555b25555b55b5b55b5b5b55b5b55b55b5b5b5b5b5b5b5b5b5.jpg.以下以下以下以下以下以下,”,”以下,“存储”以下,“储存”储存”储存”以下,“储存”储存“储存”储存“储存”以下:“储存”储存”以下:“储存”储存:储存:储存:储存:储存”以下以下:“储存”储存:储存”储存“储存”以下以下以下,”,”,”储存“储存“储存”储存”储存,”,”,”,”以及元数据“储存“储存”以下以下以下,”,”,”,”元数据:,元数据::“。“元数据:,,元数据:,元数据::“以下以下以下以下,”元数据::,,,元数据:::,元数据:::“store\”,“metadata\”:{“filename\”:“Shire-s320170627-29702-17km6c5.jpg\”,“size\”:61356,“mime\”:“image/jpeg\”,“width\”:500,““height\”:500},““small\”:{“id\”:“photo/47/image/small-2CD0928D02826F0614086A06A01EE97EF32.jpg\”,“storage\”,“store\”,“store\”,“store\”,“metadata\”,“store\”DAT