小编Chr*_*fer的帖子

PGError:错误:当前事务中止

使用: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)

postgresql ruby-on-rails

24
推荐指数
2
解决办法
1万
查看次数

Rails:验证条件多次

使用: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)?

ruby validation if-statement ruby-on-rails

17
推荐指数
1
解决办法
9263
查看次数

我的旧网站是否被正确重定向?

大约一年前,我将三个网站(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的第一行是这样的:

  match "/(*path)" => redirect {|params, req| "http://www.newsite.se/#{params[:path]}"},  via: [:get, :post]
Run Code Online (Sandbox Code Playgroud)

我使用这个(瑞典语)工具来验证这个重定向实际上是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真正意识到网站没有被移动.

  • 在Google网站站长工具和"传入链接"中,顶级链接域名为herokuapp.com,在术语上表示oldsite.com.即301重定向似乎被解释为链接(而不是重定向).
  • 我经常在Google WMT上获得关于"not founds/404's"的新指示(不知道英文版本中的这个部分是什么)对于newsite.se无法达到的url.当我查看这些网址的来源时,我经常会看到来自例如oldsite.nu/oldpath/productitem/1234的链接 - 就像有人(谷歌?)仍然访问过这个旧网址.其中一个重要的部分是我没有那么多链接到旧网站,所以我不希望这些链接仍然来自流量.
  • 我仍然可以获得许多旧路径的流量(来自oldsite.com/oldsite.new).我通过我的重定向控制器找到它,它每天处理旧路径上的大量请求.
  • 该网站在Google …

redirect ruby-on-rails heroku

12
推荐指数
1
解决办法
174
查看次数

Ruby:为什么1.025.round(2)舍入到1.02?

据我所知.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)

我该怎么做才能解决这个问题?

ruby floating-point decimal rounding

11
推荐指数
1
解决办法
4720
查看次数

Rails:validates_length_of:allow_nil不允许nil

使用: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?搞乱的问题.

代码有问题吗?

validation null ruby-on-rails

11
推荐指数
1
解决办法
6748
查看次数

Rails app中的内存不断增加

我最近推出了一个新的Ruby on Rails应用程序,它在开发模式下运行良好.在发布之后,我一直在体验正在使用的内存不断增加:

来自New Relic的屏幕转储,Dyno内存使用情况

更新:当从New Relic进行此屏幕转储时. 我已经安排了每小时重启web dyno(两个web dynos中的一个). 因此,它没有达到500Mb的崩溃水平,它实际上得到了一些sig锯模式. 但问题根本没有得到解决,只有一些症状. 你可以看到早上不是那么忙,但下午更忙.

更新:当从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)

memory ruby-on-rails heroku

11
推荐指数
2
解决办法
7608
查看次数

I18N翻译"." 或"%"导致完整的所有翻译

我在使用I18n的Rails翻译应用程序中遇到了问题.我在这样的数组中创建动态句子[:this_is_a, 5, :which_is_a_number, "."],我逐个翻译每个单词.

当我遍历这个并翻译I18n.t(".")时,我在我的整个应用程序中获得了所有翻译的完整数组,输出了1000多个数组文本.这似乎也适用于I18n.t("%").

有没有设置阻止这种情况发生?我目前唯一的解决方案是改变所有"." "."但我希望有更好的解决方案.有什么建议?

ruby-on-rails rails-i18n

9
推荐指数
1
解决办法
186
查看次数

Rails:在后处理器中渲染视图内容(模型/帮助器问题)

我有一个网络应用程序,我也有一个非常复杂的博客类型.对于这个博客,除了自制的标记语言之外,我还使用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然后执行保存.是的,这很难看.

我的问题

  1. 解决这个问题最优雅的方法是什么?
  2. 如果没有一个好方法,至少,当我从模型中调用ApplicationHelper时,如何访问partials?

ruby-on-rails view-helpers

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

使用i18n-active_record进行I18n转换:相同键的相同形式

我正在使用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)

或类似的,以便以一种形式更新一个密钥的所有实例.我似乎找不到任何关于那个的东西,这让我很困惑.

有没有办法轻松做到这一点?任何类型的黑客也都可以.

rubygems ruby-on-rails rails-i18n

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

外部I18n语言环境路径(AWS)

我有一个基于数据库的翻译系统,我的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)?它甚至可能吗?如果没有,是否有解决方法?

ruby-on-rails heroku amazon-s3 amazon-web-services

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