小编she*_*edd的帖子

Rails 3.1中的Rails.cache错误 - TypeError:无法使用默认proc转储哈希

我在3.1.0.rc4上遇到了Rails.cache方法的问题(ruby 1.9.2p180(2011-02-18修订版30909)[x86_64-darwin10]).该代码在2.3.12(ruby 1.8.7(2011-02-18 patchlevel 334)[i686-linux],MBARI 0x8770,Ruby Enterprise Edition 2011.03)上的相同应用程序中正常工作,但在升级后开始返回错误.我还没弄清楚原因.

尝试缓存具有多个范围的对象时,似乎会发生错误.

此外,无论使用多少范围,使用lambdas的任何范围都会失败.

我从这些模式中遇到了失败:

Rails.cache.fetch("keyname", :expires_in => 1.minute) do
    Model.scope_with_lambda
end


Rails.cache.fetch("keyname", :expires_in => 1.minute) do
    Model.scope.scope
end
Run Code Online (Sandbox Code Playgroud)

这是我收到的错误:

TypeError: can't dump hash with default proc
    from /project/shared/bundled_gems/ruby/1.9.1/gems/activesupport-3.1.0.rc4/lib/active_support/cache.rb:627:in `dump'
    from /project/shared/bundled_gems/ruby/1.9.1/gems/activesupport-3.1.0.rc4/lib/active_support/cache.rb:627:in `should_compress?'
    from /project/shared/bundled_gems/ruby/1.9.1/gems/activesupport-3.1.0.rc4/lib/active_support/cache.rb:559:in `initialize'
    from /project/shared/bundled_gems/ruby/1.9.1/gems/activesupport-3.1.0.rc4/lib/active_support/cache.rb:363:in `new'
    from /project/shared/bundled_gems/ruby/1.9.1/gems/activesupport-3.1.0.rc4/lib/active_support/cache.rb:363:in `block in write'
    from /project/shared/bundled_gems/ruby/1.9.1/gems/activesupport-3.1.0.rc4/lib/active_support/cache.rb:520:in `instrument'
    from /project/shared/bundled_gems/ruby/1.9.1/gems/activesupport-3.1.0.rc4/lib/active_support/cache.rb:362:in `write'
    from /project/shared/bundled_gems/ruby/1.9.1/gems/activesupport-3.1.0.rc4/lib/active_support/cache.rb:299:in `fetch'
    from (irb):62
    from /project/shared/bundled_gems/ruby/1.9.1/gems/railties-3.1.0.rc4/lib/rails/commands/console.rb:45:in `start'
    from /project/shared/bundled_gems/ruby/1.9.1/gems/railties-3.1.0.rc4/lib/rails/commands/console.rb:8:in `start'
    from /project/shared/bundled_gems/ruby/1.9.1/gems/railties-3.1.0.rc4/lib/rails/commands.rb:40:in `<top (required)>'
    from script/rails:6:in `require'
    from script/rails:6:in `<main>'
Run Code Online (Sandbox Code Playgroud)

我已经尝试使用:raw => …

ruby memcached caching ruby-on-rails ruby-on-rails-3

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

如何在脱机.gem文件中使用Bundler?

对于我的应用程序,我需要处理加密的ZIP文件.尽管看起来可怕的网站,但似乎Chilkat的商业Zip宝石可能是实现这一目标的最佳方式.

因为这是一个商业宝石,所以他们没有在Bundler看到的任何典型宝石资源中使用它.我能够在Mac OS X下安装Linux 64位版本的gem(虽然我还没有尝试过运行它,所以还没有任何关于它是否真的有用的话).但是,我首先尝试让Bundler从我下载的.gem文件中识别并加载gem.

Bundler有一个路径属性,我试图在几个方面使用它,但我还没有让它工作:

  1. 我尝试使用path指向.gem文件本身,但路径需要一个目录.
  2. 我尝试将.gz添加到.gem文件的末尾并将其解压缩 - 我在里面找到了一个带有data.tar.gz和metadata.gz的目录.路径指向提取的目录,这两个文件不起作用.
  3. 我尝试提取data.tar.gz和metadata.gz,并将提取的版本放在我指向的路径中.这失败了.
  4. 我注意到gem没有gemspec文件 - 我创建了一个并将其放在目录中.没运气.

这是我得到的错误:

$ bundle install
Fetching source index for http://rubygems.org/
Fetching source index for http://gems.github.com/
Could not find gem 'chilkat (>= 0, runtime)' in source at /Users/username/appname/vendor/cache/chilkat-9.1.0-x86_64-linux.
Source does not contain any versions of 'chilkat (>= 0, runtime)'
Run Code Online (Sandbox Code Playgroud)

关于如何让Bundler看到gem确实在这个目录中的任何想法?路径属性以外的任何其他选项似乎都不起作用?

非常感谢!

ruby rubygems ruby-on-rails bundler

33
推荐指数
3
解决办法
3万
查看次数

Rails 3个额外的会话配置选项(key,expires_after,secure)

有人可以指出新的Rails 3.x会话配置选项是什么?

我正在尝试复制我在Rails 2.3.x应用程序中的相同配置.

这是我在应用程序中使用的配置:

#environment.rb
config.action_controller.session_store = :active_record_store

config.action_controller.session = {
    :key         => '_something', #non-secure for development
    :secret      => 'really long random string'
  }


# production.rb - override environment.rb for production
config.action_controller.session = {
  :key            => '_something_secure',
  :secret         => 'really long random string',
  :expire_after   => 60*60,#time in seconds
  :secure         => true #The session will now not be sent or received on HTTP requests.
}
Run Code Online (Sandbox Code Playgroud)

但是,在Rails 3.x中,我只能提到以下内容:

AppName::Application.config.session_store :active_record_store

AppName::Application.config.secret_token = 'really long random string'

AppName::Application.config.cookie_secret = 'another really long …
Run Code Online (Sandbox Code Playgroud)

ruby ruby-on-rails session-variables session-state ruby-on-rails-3

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

Ruby on Rails通过自我引用的跟随/关注者关系

has_many上有很多帖子和帖子:通过,但我没有找到任何具体涵盖我正在尝试做的事情.

我有一个用户模型和一个友谊模型.用户有许多跟随他们的用户,以及许多关注者.这是通常的Twitter模型.

对于给定用户,我想设置Active Record关系,该关系返回跟随用户并且用户是其关注者的实际用户.

这些是我设置的关系:

class User < ActiveRecord::Base

  has_many :following, :class_name => 'User', :through => :friendships, :foreign_key => 'user_id'

  has_many :followers, :class_name => 'User', :through => :friendships, :foreign_key => 'friend_id'

end

class Friendship < ActiveRecord::Base

  belongs_to :user
  belongs_to :following, :class_name => 'User', :foreign_key => 'friend_id'
  belongs_to :follower, :class_name => 'User', :foreign_key => 'user_id'

end
Run Code Online (Sandbox Code Playgroud)

以下关系有效 - 它生成以下连接:

SELECT `users`.* FROM `users` INNER JOIN `friendships` ON `users`.id = `friendships`.friend_id WHERE ((`friendships`.user_id = 1))
Run Code Online (Sandbox Code Playgroud)

一切都很棒.

但是,追随者关系不起作用.我尝试了很多变化,但大多数似乎都返回与Follow相同的结果集.

我需要按如下方式设置连接以返回正确的结果集.

SELECT `users`.* FROM `users` …
Run Code Online (Sandbox Code Playgroud)

activerecord ruby-on-rails

22
推荐指数
2
解决办法
7639
查看次数

Rails - 部署后无效的真实性令牌

我们使用EngineYard Cloud来部署我们的Ruby on Rails应用程序.我们正在运行Rails v2.3.3.

EngineYard Cloud以类似于Capistrano的方式部署到AWS实例.每次部署后,我们都会遇到无效的真实性令牌错误.具体而言,任何先前访问过我们的应用程序然后在部署后访问然后尝试提交表单的用户都会收到无效的真实性令牌错误.在重置网站的Cookie之前,此错误仍然存​​在.重置Cookie后,该网站按预期工作,没有任何错误.

我们正在使用ActiveRecord的会话存储,会话正在保存到数据库中.

这是我们看到的错误:

ActionController :: InvalidAuthenticityToken /usr/lib/ruby/gems/1.8/gems/actionpack-2.3.3/lib/action_controller/request_forgery_protection.rb:79:in`verify_authenticity_token'

部署后会话对象为nil,但会话数据仍然存在于数据库中,并且会话ID cookie仍然存在:

会议:

  • 会话ID:无
  • 数据:无

我们无法解释这一点.关于什么可能是根本原因的任何想法?

谢谢你的任何建议!


编辑:为了更新这个,我们已经能够找出错误的一个例子.

1)用户加载表单2)代码在服务器上更新3)用户提交表单**发生无效的真实性令牌错误

似乎当环境发生变化时,Rails无法使用真实性令牌处理此问题.

我们已经尝试了几个步骤来解决:

  • 重置会话
  • 删除会话cookie(包括JavaScript和Rails)
  • 部署代码后擦除数据库中的会话表

什么都行不通.唯一有效的方法是让用户清除客户端的cookie.

(我们一直在谷歌搜索(甚至试过Binging!)寻找答案,但没有骰子.这似乎是一个类似的相关问题:http://railsforum.com/viewtopic.php?id = 21479 )

另外:最初我们认为这与我们对EngineYard的部署是隔离的,但我们也能够在我们通过Capistrano部署的开发服务器上重现它.

任何想法都会被感激地接受.

谢谢!

ruby deployment ruby-on-rails

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

Rails - 两个应用程序之间的共享数据库表

我们将很快发布一个配套的Rails应用程序到我们现有的Rails应用程序.我们将在同一台服务器上与现有应用程序一起运行配套应用程序.

我的问题涉及数据库.我的托管服务提供商通常会为新应用程序配置第二个不同的数据库 - secondappname_production.但是,应用程序之间有一系列共享表.这些共享表也由一系列cron作业维护.如果可能的话,我希望避免重复这些表(以及cron作业).

有没有办法可以将这些共享表放在Rails应用程序可以利用的共享数据库中?有关如何配置或文档指针的任何建议?

非常感谢!

编辑:澄清为什么我不想从同一个数据库运行这两个应用程序:两个应用程序都有相同名称的模型(但模型的不同属性等),所以我宁愿不运行两个相同的DB ....

ruby mysql database ruby-on-rails

16
推荐指数
1
解决办法
3829
查看次数

Rails 3.1资产管道 - 从公共/资产中丢失文件 - 为什么这不是默认值?

在今天下午将我升级的Rails 2.3.x - > 3.1(rc4)应用程序部署到我们的测试环境后,我们所有的样式表和JavaScript文件都返回了404错误.我们已经将rake资产:预编译任务添加到我们的部署后脚本中,并且花了一些时间来确定assets文件夹为什么没有我们预期的预编译文件.

最后,文件没有被编译,因为默认情况下只处理application.css和application.js(+非JS/CSS文件).

我们需要更改以下配置值,如下所示:

config.assets.precompile += %w( *.js *.css )
Run Code Online (Sandbox Code Playgroud)

问题:为什么这不是默认值?

我原本预计,任何不必作为清单文件处理的东西都会被复制到公共/资产中.我在资产管道上阅读的大部分内容基本上是"将资产放在app/assets中,配置清单文件,它应该正常工作".由于资产:预编译任务没有吐出任何有关它正在做什么的信息,因此需要一段时间才能确定它只是没有查看我们认为会存在的文件.

有什么理由说这对于预编译配置来说不是一个好的价值吗?

谢谢!

assets ruby-on-rails ruby-on-rails-3 ruby-on-rails-3.1 asset-pipeline

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

从父Factory Factory工厂访问子属性

我正在实施Factory Girl作为我的Rails应用程序中灯具的替代品.我有几个表,我试图用关联来表示.但是,为了在循环中抛出一个问题,除了定义关联之外,我还需要从父级访问子工厂的属性.

以下是我正在尝试做的一个例子:

  • 工厂:foo_bar与Factory:foo相关联,它与Factory:bar关联
  • 来自:foo_bar,我正在尝试访问两者的属性:foo和:bar

以下是样本:

Factory.define :bar do |e|
  e.name          "Bar"
end

Factory.define :foo do |e|
  e.bar         {|b| b.association(:bar)}
end

Factory.define :foo_bar do |b|
  f = b.association(:foo)
  b.foo_id      foo.id
  b.bar_id      foo.bar_id
end
Run Code Online (Sandbox Code Playgroud)

我已经完成了一些教程和其他问题,并没有看到任何如何做到这一点的例子.获得相同结果的任何想法或其他方式?

谢谢!


编辑

根据几个问题,这里有一些我最初应该包括的澄清......

:foo_bar不是连接表,而是具有其自身其他属性的模型.

这就是我实际想要完成的事情:

  • have:foo_bar创建一个关联的Factory
  • 然后让相关的工厂创建它的相关工厂
  • (这是我正在努力的元素):foo_bar从底层工厂访问一个属性

所以,如果:foo_bar>:foo>:bar然后来自:foo_bar,我正试图获取:bar的ID.

ruby testing unit-testing ruby-on-rails factory-bot

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

class_eval的类级变量的替代方法?

我对使用Ruby变量范围的最佳实践有疑问class_eval.

在此代码中,在class_eval块中,第一个和第二个局部变量是未定义的.

def parent_method(opts={})
first = opts[:percent]
second = (10 * first).to_i

SecondClass.class_eval do 
  def second_method; return {:a => first, :b => second}; end; 
end   
end
Run Code Online (Sandbox Code Playgroud)

这似乎是一个范围问题,因为我发现让它工作的唯一方法是制作第一和第二类级变量:

def parent_method(opts={})
@@first = opts[:percent]
@@second = (10 * @@first).to_i

SecondClass.class_eval do 
  def second_method; return {:a => @@first, :b => @@second}; end; 
end   
end
Run Code Online (Sandbox Code Playgroud)
  1. 这种情况的最佳做法是什么?我意识到全局变量对于这种情况来说是一个糟糕的选择,因为结果的范围很广,但类似的变量同样不受欢迎?
  2. 除了处理变量范围之外,还有其他方法可以解决这些变量的可访问性class_eval吗?

ruby variables scope ruby-on-rails

3
推荐指数
1
解决办法
993
查看次数

如何跨多个连接的行强制执行SQL连接条件?

假设您有一个数据库架构,其中包含与游戏相关的锦标赛.锦标赛可能有很多比赛.

我正在尝试参加比赛,只会在未来的所有比赛中回归锦标赛.

SELECT DISTINCT tournaments.*
FROM tournaments
INNER JOIN games ON tournaments.game_id = games.id
WHERE games.event_date >= NOW();
Run Code Online (Sandbox Code Playgroud)

还有一些我正在加入的表格,但为了这个例子,我简化了它.

我的查询是拉回结果,而不是将来所有比赛中的所有比赛.

我也尝试将条件移入连接:

SELECT DISTINCT tournaments.*
FROM tournaments
INNER JOIN games ON (tournaments.game_id = games.id AND games.event_date >= NOW())
Run Code Online (Sandbox Code Playgroud)

但我得到了相同的结果.

如何确保将来返回的所有锦标赛都有游戏 - 也就是说,在所有加入的行中强制执行条件?

谢谢!

mysql sql

3
推荐指数
1
解决办法
257
查看次数

在哪里找到多个Rails控制器使用的方法并限制对基本控制器的访问

我有两个控制器(比如ArticlesController和PostsController)使用大约5个相同的方法.这是使用5种方法的唯一两个控制器,因此他们不觉得它们应该位于ApplicationController中.目前,我创建了一个基本控制器(比如ContentController),然后现有的两个控制器继承自这个基础.

我的问题是 - 这是减少重复的最佳方法吗?

第二个问题 - 如何确保这些方法只能由从基础继承的控制器访问?在上面的示例中,我不希望直接访问ContentController.

谢谢!

ruby model-view-controller inheritance ruby-on-rails

3
推荐指数
1
解决办法
799
查看次数

'转到undefined subroutine&main :: 1'编写一个简单的Perl调试器

我正在尝试编写一个简单的Perl调试器,我遇到了以下问题.

我正在运行以下代码作为调试器:

{
  package DB;

  sub DB { }

  sub sub
  {
    &$sub;

    # this is what produces the problem
    $i = 1*1;
  }
}

1;
Run Code Online (Sandbox Code Playgroud)

我通过设置PERL5DB环境变量来加载它 - 例如:

export PERL5DB ="BEGIN {require'./debugger/tracer.pl';}

鉴于这个简单的小Perl脚本:

#!/usr/bin/env perl

use Getopt::Long;

print "hello world";
Run Code Online (Sandbox Code Playgroud)

我正在运行脚本:

perl -d test.pl

运行时,会生成以下错误:

$ perl -d test.pl
Goto undefined subroutine &main::1 at /home/vagrant/perl5/perlbrew/perls/perl-5.16.0/lib/site_perl/5.16.0/Exporter.pm line 25.
BEGIN failed--compilation aborted at test.pl line 6.
Run Code Online (Sandbox Code Playgroud)

我把问题分离到了&$ sub之后运行的任何东西; 在调试器中调用sub.这个问题发生在基本Perl脚本中包含的某些包 - 在这种情况下,Getopt :: Long,尽管我也在IO :: File中找到了相同的结果.

我的Perl非常生疏,特别是在调试器等高级主题方面.

任何人都可以帮助我理解如何在&$ …

debugging perl perl-module

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