我在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 => …
对于我的应用程序,我需要处理加密的ZIP文件.尽管看起来可怕的网站,但似乎Chilkat的商业Zip宝石可能是实现这一目标的最佳方式.
因为这是一个商业宝石,所以他们没有在Bundler看到的任何典型宝石资源中使用它.我能够在Mac OS X下安装Linux 64位版本的gem(虽然我还没有尝试过运行它,所以还没有任何关于它是否真的有用的话).但是,我首先尝试让Bundler从我下载的.gem文件中识别并加载gem.
Bundler有一个路径属性,我试图在几个方面使用它,但我还没有让它工作:
这是我得到的错误:
$ 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确实在这个目录中的任何想法?路径属性以外的任何其他选项似乎都不起作用?
非常感谢!
有人可以指出新的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
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) 我们使用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.
(我们一直在谷歌搜索(甚至试过Binging!)寻找答案,但没有骰子.这似乎是一个类似的相关问题:http://railsforum.com/viewtopic.php?id = 21479 )
另外:最初我们认为这与我们对EngineYard的部署是隔离的,但我们也能够在我们通过Capistrano部署的开发服务器上重现它.
任何想法都会被感激地接受.
谢谢!
我们将很快发布一个配套的Rails应用程序到我们现有的Rails应用程序.我们将在同一台服务器上与现有应用程序一起运行配套应用程序.
我的问题涉及数据库.我的托管服务提供商通常会为新应用程序配置第二个不同的数据库 - secondappname_production.但是,应用程序之间有一系列共享表.这些共享表也由一系列cron作业维护.如果可能的话,我希望避免重复这些表(以及cron作业).
有没有办法可以将这些共享表放在Rails应用程序可以利用的共享数据库中?有关如何配置或文档指针的任何建议?
非常感谢!
编辑:澄清为什么我不想从同一个数据库运行这两个应用程序:两个应用程序都有相同名称的模型(但模型的不同属性等),所以我宁愿不运行两个相同的DB ....
在今天下午将我升级的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
我正在实施Factory Girl作为我的Rails应用程序中灯具的替代品.我有几个表,我试图用关联来表示.但是,为了在循环中抛出一个问题,除了定义关联之外,我还需要从父级访问子工厂的属性.
以下是我正在尝试做的一个例子:
以下是样本:
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不是连接表,而是具有其自身其他属性的模型.
这就是我实际想要完成的事情:
所以,如果:foo_bar>:foo>:bar然后来自:foo_bar,我正试图获取:bar的ID.
我对使用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)
class_eval吗?假设您有一个数据库架构,其中包含与游戏相关的锦标赛.锦标赛可能有很多比赛.
我正在尝试参加比赛,只会在未来的所有比赛中回归锦标赛.
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)
但我得到了相同的结果.
如何确保将来返回的所有锦标赛都有游戏 - 也就是说,在所有加入的行中强制执行条件?
谢谢!
我有两个控制器(比如ArticlesController和PostsController)使用大约5个相同的方法.这是使用5种方法的唯一两个控制器,因此他们不觉得它们应该位于ApplicationController中.目前,我创建了一个基本控制器(比如ContentController),然后现有的两个控制器继承自这个基础.
我的问题是 - 这是减少重复的最佳方法吗?
第二个问题 - 如何确保这些方法只能由从基础继承的控制器访问?在上面的示例中,我不希望直接访问ContentController.
谢谢!
我正在尝试编写一个简单的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非常生疏,特别是在调试器等高级主题方面.
任何人都可以帮助我理解如何在&$ …
ruby-on-rails ×10
ruby ×8
mysql ×2
activerecord ×1
assets ×1
bundler ×1
caching ×1
database ×1
debugging ×1
deployment ×1
factory-bot ×1
inheritance ×1
memcached ×1
perl ×1
perl-module ×1
rubygems ×1
scope ×1
sql ×1
testing ×1
unit-testing ×1
variables ×1