使用:Rails 3.0.3和Heroku与Postgresql.
我收到了很多这样的例外情况:
A ActiveRecord::StatementInvalid occurred in home#index:
PGError: ERROR: current transaction is aborted, commands ignored until end of transaction block
: SELECT "calculation_types".* FROM "calculation_types"
.bundle/gems/ruby/1.9.1/gems/activerecord-3.0.3/lib/active_record/connection_adapters/abstract_adapter.rb:202:in `rescue in log'
Run Code Online (Sandbox Code Playgroud)
在我的应用程序中发生,但总是在我执行这种情况时
calculation_type = CalculationType.find(params[:id])
Run Code Online (Sandbox Code Playgroud)
或者类似的,超级简单的数据库请求.
我的宝石列表(从我上传到Heroku时):
Installing rake (0.9.2.2)
Installing abstract (1.0.0)
Installing activesupport (3.0.3)
Installing builder (2.1.2)
Installing i18n (0.6.1)
Installing activemodel (3.0.3)
Installing erubis (2.6.6)
Installing rack (1.2.5)
Installing rack-mount (0.6.14)
Installing rack-test (0.5.7)
Installing tzinfo (0.3.33)
Installing actionpack (3.0.3)
Installing mime-types (1.19)
Installing polyglot (0.3.3)
Installing treetop …Run Code Online (Sandbox Code Playgroud) 使用:Rails 3.0.3
我有这样的验证:
validates_numericality_of :person_weight_kg, :greater_than => 0, :message => "value_must_be_number_over_zero", :if => :bmi_calculation?, :if => :is_metric?
Run Code Online (Sandbox Code Playgroud)
我想验证多个if条件(例如在示例中).但是,似乎Rails将这些语句视为OR.一个返回false,一个返回true,这使验证通过.
那么,我如何检查此验证是否满足两个if语句(bmi_calculation AND is_metric)?
大约一年前,我将三个网站(oldsite.com,oldsite.nu,newsite.se)合并为一个,我保留在其中一个域(newsite.se)上.我不确定这是否已经完成,因为即使在一年之后,我仍然会看到来自谷歌的旧网址的大量流量.
Oldsite重定向代码
重要的编辑说明:我最近意识到名称服务器不再指向我的旧rails应用程序,而是指向我的Web主机上的php文件夹,其中我有一个.htaccess,代码如下:
RewriteEngine on
RewriteRule ^robots.txt - [L]
RewriteRule ^sitemap.xml - [L]
RewriteRule ^(.*)$ http://www.newsite.se/$1 [R=301,L]
Run Code Online (Sandbox Code Playgroud)
这使得下面的这一部分(关于oldsite.com/oldsite.nu)无效: .com和.nu是在Ruby on Rails中构建的,并在Heroku上托管.
从oldsite.com/oldsite.nu 重定向路径的逻辑完全在newsite.se站点上完成.oldsites上的重定向代码是一个简单的重定向,在oldsite.com上的routes.rb的第一行是这样的:
Run Code Online (Sandbox Code Playgroud)match "/(*path)" => redirect {|params, req| "http://www.newsite.se/#{params[:path]}"}, via: [:get, :post]
我使用这个(瑞典语)工具来验证这个重定向实际上是301重定向:http://301redirect.se.它确认重定向为301.
Newsite.se重定向处理程序
每个旧网站上的内容与新网站上的相同内容相匹配,很少在相同的路径上,例如
oldsite.com/categories/vacation/item/1243
Run Code Online (Sandbox Code Playgroud)
可能会导致
newsite.se/product-items/1243
Run Code Online (Sandbox Code Playgroud)
我主要在内部重定向控制器中处理这些类型的重定向,该控制器捕获并重定向newsite.se上的任何流量,如:
newsite.se/categories/vacation/item/1243 -> newsite.se/product-items/1243
Run Code Online (Sandbox Code Playgroud)
在我的newsite.se routes.rb底部使用它:
match '*not_found_path', :to => 'redirections#not_found_catcher', via: :get, as: :redirect_catcher, :constraints => lambda{|req| req.path !~ /\.(png|gif|jpg|txt|js|css)$/ }
Run Code Online (Sandbox Code Playgroud)
这很好用.
编辑20151223:我使用Newsite.se处理重定向的原因是因为它包含重定向路径的所有逻辑.Oldsite.com/.nu几乎不可能知道这一点.
所采取的行动
在重定向301之外(据我所知,我这样做).我还使用Google网站管理员工具从旧的两个网站向我的新网站发出"请求更改地址".我再也找不到任何关于此的信息了,但我确信我得到了WMT的积极回应,这个游戏已经完成(但我不是100%肯定).
问题的迹象
我不是100%确定有什么问题,但我已经看到让我相信重定向不正确的迹象,以便Google真正意识到网站没有被移动.
据我所知.round(),红宝石中的函数向上舍入小数点,其中最后一个有效数字是5?
例如1.5.round(0) # => 2(好的)
但为什么1.025.round(2) # => 1.02,而不是1.03我所期望的?
irb(main):037:0> 1.025.round(2)
=> 1.02
Run Code Online (Sandbox Code Playgroud)
我该怎么做才能解决这个问题?
使用:Rails 3.0.3.
我在验证器中使用此代码:
validates_length_of :birth_date_8, :minimum => 8, :allow_nil => true, :message => "value_is_not_a_proper_date", :if =>:family_birthday?
Run Code Online (Sandbox Code Playgroud)
但是,它不允许该字段为零.我已经检查过了,这不是一件容易:if => :family_birthday?搞乱的问题.
代码有问题吗?
我最近推出了一个新的Ruby on Rails应用程序,它在开发模式下运行良好.在发布之后,我一直在体验正在使用的内存不断增加:


更新:当从New Relic获取此屏幕转储(下面的那个)时.我已经安排了每小时重启web dyno(两个web dynos中的一个).因此,它没有达到500Mb的崩溃水平,它实际上得到了一些sig锯模式.但问题根本没有得到解决,只有一些症状.你可以看到早上不是那么忙,但下午更忙.我在11.30上传了一个小细节,即使它在统计数据中显示也不会影响问题.
还可以注意到,即使图形显示AVG存储器,也是MIN存储器继续增加.即使图形似乎在图表中暂时下降,最小内存保持不变或增加.MIN记忆永不减少!
该应用程序将(没有dyno重新启动)内存增加,直到它达到Heroku的最高级别,并且应用程序崩溃执行过期类型的错误.
我不是一个优秀的程序员,但我之前已经制作了一些应用程序而没有这类问题.
执行故障排除
答:我认为问题在于application_controller中的before_filter(应用程序控制器中的变量会导致Rails中的内存泄漏吗?)但这不是问题.
B.我安装了oink但它没有给出任何结果(根本).它创建了一个oink.log,但是当我运行"heroku run oink -m log/oink.log"时,无论什么阈值都没有给出任何结果.
C.我尝试过bleak_house但它已被弃用,无法安装
D.我用谷歌搜索并阅读了主题中的大多数文章,但我不是更明智的.
E.我很想测试memprof但是我无法安装它(我有Ruby 1.9x并且不知道如何将它降级到1.8x)
我的问题:
Q1.我真正想知道的是每个请求增加的变量的名称,或者至少哪个控制器使用最多的内存.
Q2.一个控制器如下面的代码会增加内存吗?
related_feed_categories = []
@gift.tags.each do |tag|
tag.category_connections.each do |cc|
related_feed_categories << cc.category_from_feed
end
end
Run Code Online (Sandbox Code Playgroud)
(抱歉,因为某些原因,所以不会重新格式化代码以便于阅读).
我之后是否需要使用"related_feed_categories = nil""kill""related_feed_categories"或垃圾收集器是否处理该问题?
Q3.我要找的主要内容是什么?现在我无法缩小范围.我不知道要深入研究哪部分代码,我真的不知道该寻找什么.
Q4.万一我真的无法解决问题.有没有在线咨询服务,我可以发送我的代码,让他们找到问题?
谢谢!
更新.收到评论后,它可能与会话有关.这是我认为可能不好的代码的一部分:
# Create sessions for last generation
friend_data_arr = [@generator.age, @generator.price_low, @generator.price_high]
friend_positive_tags_arr = []
friend_negative_tags_arr = []
friend_positive_tags_arr << @positive_tags
friend_negative_tags_arr << @negative_tags
session["last_generator"] = [friend_data_arr, friend_positive_tags_arr, friend_negative_tags_arr]
# Clean …Run Code Online (Sandbox Code Playgroud) 我在使用I18n的Rails翻译应用程序中遇到了问题.我在这样的数组中创建动态句子[:this_is_a, 5, :which_is_a_number, "."],我逐个翻译每个单词.
当我遍历这个并翻译I18n.t(".")时,我在我的整个应用程序中获得了所有翻译的完整数组,输出了1000多个数组文本.这似乎也适用于I18n.t("%").
有没有设置阻止这种情况发生?我目前唯一的解决方案是改变所有"." "."但我希望有更好的解决方案.有什么建议?
我有一个网络应用程序,我也有一个非常复杂的博客类型.对于这个博客,除了自制的标记语言之外,我还使用RedCarpet作为标记语言,这非常有用.
在我自制的标记语言中,我从应用程序中调用了产品视图和其他部分内容.我在两个不同的模型中使用它:BlogPost和Article.
例如,博客文章可能是这样的:
@blog_post.unprocessed_content = "Today I would like to show you this **cool** product that we offer: [[PRODUCT#ID:123]]."
Run Code Online (Sandbox Code Playgroud)
[[PRODUCT#ID:123]]是我自己的标记语言,很酷的是RedCarpet.我使用ApplicationHelper中的render_content方法,如下所示:
processed_content = render_content(@blog_post.unprocessed_content)
Run Code Online (Sandbox Code Playgroud)
哪个会输出
processed_content = "Today I would like to show you a <strong>cool</strong> product that we offer: <h3>Apple</h3><img src="apple.jpg"><p>Apple is a nice fruit.</p>. Price: 1 USD."
Run Code Online (Sandbox Code Playgroud)
"apple"部分是从视图部分获取的.
ApplicationHelper中的方法使用例如: - render partials/blog_post/product_item_with_pic - RedCarpet标记
我以标记/未处理状态编写所有文章/博客文章,但在我发布并加载了render_content()时预处理此内容是完全合理的:before_save.
基本上,我想使用:来自BlogPost和Article 模型的 before_save,但后来我遇到了尝试从模型中做帮助的东西的问题,这一切都变得混乱.
我试着用:
ApplicationController.helpers.render_content(@blog_post.unprocessed_content)
Run Code Online (Sandbox Code Playgroud)
但后来它找不到像/ blog_post/product_item_with_pic这样的视图部分.感觉就像我会继续碰到这样的问题.
现在,我有一个非常丑陋的解决方案(可行),并且在加载视图时在视图中完成预处理.基本上,在admin :: blog_post #show中我调用render_content然后执行保存.是的,这很难看.
我正在使用i18n-active_record 0.1.0在Rails 4中开发一个应用程序来保存我的翻译而不是.yml文件.它工作正常.
然而,我正在努力的一件事是,每个翻译记录是每个语言环境的一个记录,即
#1. { locale: "en", key: "hello", value: "hello")
#2. { locale: "se", key: "hello", value: "hej")
Run Code Online (Sandbox Code Playgroud)
这使得更新它们是一项繁琐的工作.我希望将它作为一个,即:
{ key: "hello", value_en: "hello", value_se: "hej" }
Run Code Online (Sandbox Code Playgroud)
或类似的,以便以一种形式更新一个密钥的所有实例.我似乎找不到任何关于那个的东西,这让我很困惑.
有没有办法轻松做到这一点?任何类型的黑客也都可以.
我有一个基于数据库的翻译系统,我的Rails应用程序很好用,除了它显然向数据库发送了很多请求.我只能对一定数量的请求使用缓存,但对我来说可行的选择是将转换表导出到YAML文件中,该文件可由系统读取.
我遇到的问题是我的应用程序在Heroku上,你无法写入该文件系统,我必须使用AWS(使用Carrierwave)来存储语言环境文件.我可以写信给AWS但是我无法让我的Rails应用程序从我的AWS存储中读取语言环境文件.
我尝试了以下设置(这只是试验和错误),但它不起作用.
application.rb中
config.i18n.load_path += Dir[Rails.root.join('my', 'locales', '*.{rb,yml}').to_s]
config.i18n.load_path += Dir["https://s3-eu-west-1.amazonaws.com/myapp/locales/", '*.{rb,yml}'.to_s]
config.i18n.available_locales = [:en, :se]
Run Code Online (Sandbox Code Playgroud)
编辑:我当前(繁琐)的工作流程是创建数据库中的所有翻译(使用数据库翻译是绝对必须为我btw).然后我将表导出到yaml到我的AWS存储中.从那里我将语言环境文件下载到我的本地应用程序和locale-folder.我再次将它全部上传回Heroku.因为我无法写入Heroku文件系统.
如何设置我的应用程序以便从此外部源读取区域设置文件(例如https://s3-eu-west-1.amazonaws.com/myapp/locales/en.yml)?它甚至可能吗?如果没有,是否有解决方法?
heroku ×3
rails-i18n ×2
ruby ×2
validation ×2
amazon-s3 ×1
decimal ×1
if-statement ×1
memory ×1
null ×1
postgresql ×1
redirect ×1
rounding ×1
rubygems ×1
view-helpers ×1