小编Chr*_*fer的帖子

如何在启动rails app时解决内存膨胀问题?

我在运行ruby 2.3.3和Rails 4.1.13的Heroku上使用Rails应用程序时出现内存问题.当我在Heroku上加载应用程序时,它的启动速度约为430 Mb,但在那里相当稳定 - 但仍然在Heroku上达到512 Mb(正如预期的那样).我的主要问题是:如何在我的应用程序的BOOT期间精确定位并减少内存使用量?即我如何减少启动时使用的内存量?

Heroku内存使用情况

我已经研究了大多数宝石,例如出轨,oink,内存分析器和stackprof,但是在找到内存膨胀和内存饥饿控制器等方面,最有帮助我的是Heroku上的Scout附加组件.通过这个我已经设法减少应用程序在内存方面增长的数量,但减少启动时使用的内存量.

我知道宝石是在启动时加载的,宝石越多,越大,启动时使用的内存就越多.跑步bundle exec derailed bundle:mem给了我这个:

TOP: 92.3008 MiB
  carrierwave-aws: 16.7461 MiB
    carrierwave/storage/aws: 16.6094 MiB
      aws-sdk-core/s3: 7.9414 MiB
      aws-sdk-resources: 2.5703 MiB
        aws-sdk-core: 2.5117 MiB
          jmespath: 1.8867 MiB
            jmespath/nodes: 1.1406 MiB
              jmespath/nodes/function: 0.3867 MiB
      seahorse/client/base: 0.9414 MiB
        seahorse/client/plugins/net_http: 0.5273 MiB
      aws-sdk-core/xml/parser/engines/rexml: 0.8633 MiB
        rexml/document: 0.8516 MiB
          rexml/element: 0.5508 MiB
  rails/all: 13.6992 MiB
    rails: 8.9453 MiB (Also required by: active_record/railtie, active_model/railtie, and 6 others)
      rails/application: 7.2188 MiB
        rails/engine: 6.8672 MiB (Also required …
Run Code Online (Sandbox Code Playgroud)

ruby memory ruby-on-rails heroku

8
推荐指数
1
解决办法
382
查看次数

处理TimeOut ::重试时出错

我有一个在Heroku上运行的应用程序,有时会报告Timeout :: Error(ActionView :: Template :: Error)"执行过期".

这种情况发生在整个网站上(即不在特定的控制器中)所以我想创建一个能处理这两个错误的函数,首先重试两次并将用户重定向到一个页面,告诉他们服务器是忙.

我目前的计划是在ApplicationController中使用以下内容:

  rescue_from Timeout::Error, :with => :rescue_from_timeout

  def rescue_from_timeout
    sleep 2
    retry 
  end
Run Code Online (Sandbox Code Playgroud)

但这只是循环和循环.我想让它在两次尝试后破裂.我怎样才能做到这一点?

另外,如何处理"执行过期"的ActionView :: Template :: Error?我不想通过重试来挽救所有的ActionView :: Template :: Error,只会引发"执行过期".

这就是我的例外情况:

[Exception] home#index (ActionView::Template::Error) "execution expired"
Run Code Online (Sandbox Code Playgroud)

要么

[Exception] calculations#result (ActionView::Template::Error) "Timeout::Error: execution expired
Run Code Online (Sandbox Code Playgroud)

我的问题是:如何通过首先重试两次然后将异常/重定向到错误页面来处理这两种类型的错误?

timeout ruby-on-rails

7
推荐指数
1
解决办法
3738
查看次数

Rails中内存泄漏的主要因素

我试着用Rails解决内存泄漏问题.我可以通过New Relic看到内存的使用量在增加而不会减少.

这是一个来自大线程(Rails应用程序内存不断增加)的衍生问题,我在解决问题时遇到了麻烦.我现在需要知道的只是:

Rails内存泄漏的主要原因/因素是什么?

据我所理解:

  • 全局变量(例如@@ variable) - 我没有这些变量

  • 符号(我没有特别创建)

  • 会议 - 在这里应该避免什么?假设我有一个会话,跟踪一个特定用户在文本搜索网站时使用的最后一个查询.我该怎么杀掉它?

  • "留下参考资料" - 这究竟意味着什么?你举个例子吗?

  • 您可以提供的任何其他错误的编码示例通常会造成内存泄漏?

我想用这些信息来查看我的代码,所以请提供示例!

最后,这会是"内存泄漏代码"吗?

ProductController
...
@last_products << Product.order("ASC").limit(5)
end
Run Code Online (Sandbox Code Playgroud)

这会让@last_products膨胀吗?

memory-leaks ruby-on-rails

6
推荐指数
1
解决办法
1168
查看次数

在Rails 3.2.11中的label_tag中渲染html(html_safe,raw not working)

使用:Rails 3.2.11和Ruby 1.8.7

我在尝试label_tag输出html 时遇到了一些严重的问题.基本上它归结为:

<%= label_tag "This will <strong>not</strong> work!" %>
Run Code Online (Sandbox Code Playgroud)

我试过了:

<%= raw label_tag "This will <strong>not</strong> work!" %>
<%= label_tag raw "This will <strong>not</strong> work!" %>
<%= label_tag "This will <strong>not</strong> work!".html_safe %>
<%= (label_tag "This will <strong>not</strong> work!").html_safe %>
Run Code Online (Sandbox Code Playgroud)

我已经安装了gem'trail_xss'.

什么都行不通!

虽然我可以通过转义html找到很多相关的问题,其中人们遇到raw和html_safe问题,但是与label_tag无关.我无法使用f.label来解决这个问题.

这曾经用于相同的应用程序,但经过一些更新(其中Rails 3.0.3 - > 3.2.11是主要的)它停止工作.我没有注意到这发生的时间,所以我不确定是什么原因引起了这个问题.

你能复制一下吗?你有解决方案吗?

label ruby-on-rails

6
推荐指数
1
解决办法
2350
查看次数

NoMethodError 未定义的方法“字段”为 nil:NilClass

使用:Rails 3.1.1

我正在尝试在我的应用程序中创建一个搜索引擎,用于浏览大型数据库(大约 100 000 个项目)以进行字符串匹配。

我正在使用以下内容:

fp = FeededProduct.where("name LIKE '%blue%'  OR description LIKE '%blue%'  OR category LIKE '%blue%'")
Run Code Online (Sandbox Code Playgroud)

对于“blue”的搜索查询。

当我在 MySQL 中运行等效的搜索短语时,它工作正常,但是当我尝试在 rails 中运行它时,它显示:

NoMethodError: undefined method `fields' for nil:NilClass: SELECT `feeded_products`.* FROM `feeded_products`  WHERE (name LIKE '%blue%'  OR description LIKE '%blue%'  OR category LIKE '%blue%')
Run Code Online (Sandbox Code Playgroud)

线索和故障排除:

这只发生在大型搜索结果中,我无法区分一个数字,但它在应该返回 920 个结果时崩溃,但在返回 6 个结果时它不会崩溃!

我对上述结论的结论要么是它无法将所有 920 个结果保留在内存中,要么是某种类型的行使其崩溃,结果越多,它就越有可能包含该类型的行。我更倾向于第一个结论。

我无法很好地对其进行故障排除,因为它在我尝试运行时崩溃(具有相同的错误代码):

raise fp.inspect
Run Code Online (Sandbox Code Playgroud)

它也会崩溃:

fp.each do |prod| 
begin 
puts 'Do nothing'
rescue
puts 'Something crashed'
end
Run Code Online (Sandbox Code Playgroud)

但它不会崩溃:

raise fp.count.inspect 
Run Code Online (Sandbox Code Playgroud)

那么,我有记忆类型的问题吗?我该怎么做才能进一步解决这个问题和/或解决问题?

使用:Mac OS X …

memory ruby-on-rails nomethoderror

5
推荐指数
1
解决办法
6576
查看次数

由于 id = null,Rails has_many through 无法以嵌套形式保存

使用 Rails 4.1.13 和 Ruby 2.0.0(虽然我在使用 Ralis 4.0 和 Ruby 1.9.3 时遇到了同样的问题。我已经阅读了许多关于这个特定问题的文章,但无法理解为什么我的解决方案(看起来完全像这样)没有工作,所以请帮助我。

我有两个模型 BlogPost 和 Tag。一个博客帖子可以有多个标签,一个标签可以有多个博客帖子。我通过第三个模型 BlogPostRelation 将它们连接起来。因此,这是我的基本设置:

# blog_post.rb
has_many :blog_post_tag_relations, dependent: :destroy
has_many :tags, :through => :blog_post_tag_relations
accepts_nested_attributes_for :blog_post_tag_relations, :tags

# tag.rb
has_many :blog_post_tag_relations, dependent: :destroy
has_many :blog_posts, :through => :blog_post_tag_relations

# blog_post_tag_relation.rb
belongs_to :tag
belongs_to :blog_post  
validates_uniqueness_of :tag_id, :scope => [:blog_post_id]
validates :blog_post_id, :presence => true
validates :tag_id, :presence => true    
accepts_nested_attributes_for :tag, :blog_post
Run Code Online (Sandbox Code Playgroud)

我有一个使用 Formtastic 的 BlogPost 表单,我在其中使用以下命令为 BlogPost 创建复选框:

<%= f.input :blog_title %> …
Run Code Online (Sandbox Code Playgroud)

ruby-on-rails nested-forms has-and-belongs-to-many

5
推荐指数
1
解决办法
747
查看次数

移动设备中的InvalidAuthenticityToken错误

我已经在StackOverflow上阅读了关于InvalidAuthenticityToken和protect_from_forgery的多个问题和答案,但没有更明智.

我有一个网站每天都会收到数百个这样的错误.它们似乎主要(仅限于?)来自移动设备,但我只通过样本验证过.

我理解为什么有AuthenticityToken和添加的需要

<%= csrf_meta_tags %>
Run Code Online (Sandbox Code Playgroud)

在application.html(我有)以及在应用程序控制器中有protect_from_forgery.我有csrf_meta_tags和:

protect_from_forgery with: :exception
Run Code Online (Sandbox Code Playgroud)

在我的应用程序控制器中,默认情况下.

我意识到我可以通过删除protect_from_forgery来"解决"这个问题,但这会让我容易受到CSRF攻击,所以这不是真正的解决方案,是吗?对于发生的表单帖子,我可以为protect_from_forgery添加一个"except",但这会让我感到非常脆弱,对吧?

编辑:我尝试使用移动设备访问表单,禁用Cookie并遇到422错误.无法让它导致异常.为我的"结果"函数添加一个例外删除了,但这让我觉得它很脆弱?

Edit2:我在同一页面上有几个表单(例如搜索表单).也许这会影响这个问题?

我现在处于一个我无法拥有它的位置,因为它每天导致数百名用户出错,我无法将其删除,因为我担心它会使我的网站容易受到攻击.

那么,我该怎么办?有一个像样的中间地带?

有什么方法可以改变protect_from_forgery并仍然相信我不会被黑客破坏我的数据库吗?

我没有为网站使用任何API,并且所有错误都来自相同类型的表单.我知道这个问题有一个javascript部分但不是真的如何使用该信息来解决问题.

提前致谢!

我得到的异常示例:

An ActionController::InvalidAuthenticityToken occurred in calculations#result: 

ActionController::InvalidAuthenticityToken 

------------------------------- 
Request: 
------------------------------- 

* URL : http://www.example.com/calculation/result 
* HTTP Method: PUT 
* IP address : 217.214.148.251 
* Parameters : {"utf8"=>"?", "_method"=>"put", "authenticity_token"=>"udnClerrF5UWvg84uaD82TzmPx/vWssv2wN9UPqyn10UwXqbOwa2FBtnZ5Nfo7HPh9xbA2OSrrUNineW50XiYg==", "commit"=>"Calculate", "controller"=>"calculations", "action"=>"result", "id"=>"123"} 
* Timestamp : 2016-08-19 12:11:09 UTC 
* Server : 2696e83c-1538-434d-ab6d-4e16577698d0 
* Rails root : /app 
* Process: 6 

------------------------------- 
Session: 
------------------------------- 

* session id: "42b36aacc78102605cb3365922a550b1" 
* data: {"session_id"=>"42b36aacc78102605cb3365922a550b1", …
Run Code Online (Sandbox Code Playgroud)

ruby-on-rails protect-from-forgery csrf-protection

5
推荐指数
1
解决办法
855
查看次数

通过API创建和保存Google Map(带有地标)

我想制作一个脚本:

  1. 每天创建一个Google Map
  2. 通过Lon / Lat在CSV文件中添加地标
  3. 将地图保存(并公开)到我的Google帐户。

使用Google Map API。手动操作非常容易,但是可以使用API​​吗?我只能看到如何将Google Map添加到您的网站,以及它的喜欢之处。

比方说,例如,我想每天绘制一张美国的武装抢劫地图。我有一个CSV文件,其中包含所有位置(如Lon / Lat)。我想在凌晨0.01点创建一个可以在社交媒体上共享的地图(例如,使用Twitter API共享该地图的位置)。我不想在此过程中使用网站。

这可能吗?我怎样才能做到这一点?我正在使用Ruby on Rails,但现在我更感兴趣的是了解如何在任何脚本或伪代码中完成此操作。

ruby-on-rails google-maps-api-3

5
推荐指数
0
解决办法
133
查看次数

部署rails:选择什么?

我刚刚完成了一个Rails应用程序,我现在要将其上传到Web.这是对现有应用程序的重写,我预计每天会有大约4 000名访问者,有时会达到每天10 000个峰值.

  • 我非常了解Windows(虽然没有使用过Windows服务器).
  • 我对Ubuntu或Linux几乎一无所知
  • 我希望事情变得简单易行,并且不想花太多时间"黑客攻击服务器".我想花时间开发,而不是维护.
  • 对于这个项目,我的预算最多为每月50美元.
  • 该项目的数据库非常静态(几乎没有任何用户生成的数据)
  • 我目前在我的本地安装上使用WAMP和Mysql与Rails 3.0.3并且它在大多数情况下工作正常,但也经常崩溃.

我正在考虑三种方法:

  1. 使用Heroku

    • 看起来很简单(即使我还没有让它工作)
    • 如果我需要更多节点,也似乎很贵.我应该需要多少个节点?
  2. 使用VPS Windows服务器

    • 我知道Windows,它的安装和设置都相当容易
    • 我的朋友(更像是Rails专家)说Windows和Rails并不是一个很好的匹配.
    • 我在当地环境中的崩溃使我对这个选项感到紧张
  3. 使用VPS Ubuntu服务器

    • 似乎是最便宜的选择(就预付款而言)
    • 似乎是最稳定的选择
    • 我不知道Ubuntu,我也不太愿意学习一个全新的操作系统来实现这个目标.

你能帮我指点一下吗?Windows服务器对Rails真的不好吗?

deployment ruby-on-rails

4
推荐指数
1
解决办法
192
查看次数

在 Rails 控制台中的数据库之间复制

我有三个数据库:

  • A.mynewapp_psql (Postgres)
  • B.old_products_psql (Postgres)
  • C.old_blogposts_mysql(Mysql)

每个都定义在database.yml

我使用A( mynewapp_psql) 作为我的新应用程序的数据库。在此应用程序中,我希望能够从两个旧数据库中复制选定的材料。

我的尝试(根据回复更新)

old_db = ActiveRecord::Base.establish_connection(:database => 'old_blogposts_mysql'... etc)
posts = old_db.connection.execute("select * from posts'")
posts.each do |p|
  NewPost.create(:name => p.name.downcase) #NewPost should add Post in A. (mynewapp_psql)
end
Run Code Online (Sandbox Code Playgroud)

它应该从我的旧数据库中获取每个产品,并在新数据库中创建一个新的等效产品。

我真的更喜欢通过控制台来完成此操作,并且我无法直接复制数据库,因为我需要过滤和更改数据。

database ruby-on-rails rails-console

4
推荐指数
1
解决办法
2174
查看次数