Rails 4.2中是否需要使用secret_key_base和secret_token?设置都不会导致以下异常消息:
缺失
secret_token和secret_key_base对"生产"的环境中,在设置这些值config/secrets.yml
4.2升级指南(http://railsapps.github.io/updating-rails.html)说明了这一点:
使用rails new命令创建新的Rails应用程序时,会生成一个唯一的密钥并将其写入config/initializers/secret_token.rb文件.
但是当我生成我的应用程序时没有创建这样的文件,并且config/secrets.yml中没有对secret_token的引用
我假设错误消息是错误的,并且只需要secret_key_base.当我在我的开发机器上运行我的应用程序时,它只从secret_key_base开始,但在Engineyard中,设置secret_key_base(通过环境变量)不起作用.我仍然得到错误.
什么是挽救异常并继续处理的正确方法?我有一个具有文件夹和项目的应用程序,通过名为folders_items的连接表具有habtm关系.该表具有唯一约束,确保没有重复的项目/文件夹组合.如果用户尝试多次将项目添加到同一文件夹,我显然不希望添加其他行; 但我也不想停止处理.
当违反唯一约束时,Postgres会自动抛出异常,因此我尝试在控制器中忽略它,如下所示:
rescue PG::Error, :with => :do_nothing
def do_nothing
end
Run Code Online (Sandbox Code Playgroud)
这在单次插入时工作正常.控制器执行渲染,状态代码为200.但是,我有另一种方法在循环中执行批量插入.在该方法中,控制器在遇到第一个重复行时退出循环,这不是我想要的.起初,我认为循环必须包含在正在回滚的事务中,但事实并非如此 - 重复插入之前的所有行.我希望它只是忽略约束异常并移动到下一个项目.如何防止PG :: Error异常中断此操作?
postgresql activerecord ruby-on-rails ruby-on-rails-3 rails-activerecord
我在模型上有一个after_save回调,我正在调用previous_changes来查看属性(is_complete)是否发生了变化.即使属性发生更改,previous_changes也会返回空哈希.
这是回调:
after_save do |record|
puts "********************"
puts record.previous_changes.to_s
puts record.is_complete
puts "********************"
end
Run Code Online (Sandbox Code Playgroud)
这是我在日志中得到的:
********************
{}
true
********************
********************
{}
false
********************
Run Code Online (Sandbox Code Playgroud)
如果is_complete的值从true更改为false,则它应该在previous_changes哈希中.更新正在通过正常保存完成!而且我没有重新加载这个对象.
--- 更新 ---
我在发布问题时没有考虑过这个,但是我的模型使用了awesome_nested_set gem,看来这是重新加载对象或以某种方式干扰after_save回调.当我注释掉acts_as_nested_set时,回调似乎工作正常.
--- 更新2 ---
使用around_save回调修复此问题,该回调首先确定属性是否已更改,然后生成,然后执行在数据库中进行更改后需要执行的操作.工作解决方案如下所示:
around_save do |record, block|
is_complete_changed = true if record.is_complete_changed?
block.call
if is_complete_changed
** do stuff **
end
end
Run Code Online (Sandbox Code Playgroud) activerecord ruby-on-rails ruby-on-rails-4 awesome-nested-set