Model.scoped现在不推荐使用Rails 4 .
DEPRECATION WARNING: Model.scoped is deprecated. Please use Model.all instead.
但是,有一个区别Model.scoped和Model.all,也就是说,scoped.scoped返回一个范围,而all.all运行该查询.
在Rails 3上:
> Model.scoped.scoped.is_a?(ActiveRecord::Relation)
=> true
Run Code Online (Sandbox Code Playgroud)
在Rails 4上:
> Model.all.all.is_a?(ActiveRecord::Relation)
DEPRECATION WARNING: Relation#all is deprecated. If you want to eager-load a relation, you can call #load (e.g. `Post.where(published: true).load`). If you want to get an array of records from a relation, you can call #to_a (e.g. `Post.where(published: true).to_a`).
=> false
Run Code Online (Sandbox Code Playgroud)
库/关注中的用例会scoped在有条件执行某些操作时返回,如下所示:
module AmongConcern
extend ActiveSupport::Concern
module …Run Code Online (Sandbox Code Playgroud) Jailbroken iPhone通过使用MobileSubstrate在iOS上玷污了一些基本的API,让我感到震惊.
http://www.iphonedevwiki.net/index.php/MobileSubstrate
我相信很多应用程序使用UDID作为验证设备和/或用户的手段,因为它是半自动和方便的,但你应该意识到这个问题:UIDevice并不像应该的那样防篡改.有一个叫做UDID Faker的应用程序,它可以让你轻松地在运行时欺骗别人的UDID.
http://www.iphone-network.net/how-to-fake-udid-on-ios-4/
这是它的源代码:
//
// UDIDFaker.m
// UDIDFaker
//
#include "substrate.h"
#define ALog(...) NSLog(@"*** udidfaker: %@", [NSString stringWithFormat:__VA_ARGS__]);
#define kConfigPath @"/var/mobile/Library/Preferences/com.Reilly.UDIDFaker.plist"
@protocol Hook
- (NSString *)orig_uniqueIdentifier;
@end
NSString *fakeUDID = nil;
static NSString *$UIDevice$uniqueIdentifier(UIDevice<Hook> *self, SEL sel) {
if(fakeUDID != nil) {
ALog(@"fakeUDID %@", fakeUDID);
/* if it's a set value, make sure it's sane, and return it; else return the default one */
return ([fakeUDID length] == 40) ? fakeUDID : [self orig_uniqueIdentifier];
}
/* …Run Code Online (Sandbox Code Playgroud) 当一些项目使用Redis数据库时,如何管理开发和/或测试机器上的多个项目?
有两个主要问题:
现在,我认为我们有三种选择:
redis-namespace如果多个项目为主要用途分配"0"而对于测试等分配"1"则第一个是有问题的.即使项目B决定改为"2"和"3",项目中的另一名成员也可能在另一个项目中与他发生冲突.换句话说,这种方法不是SCM友好的.
对于第二个,这只是一个坏主意,因为它在运行时性能和内存效率上增加了不必要的开销.无论你做什么,当你加入这个项目时,另一个项目可能已经巧合地使用了相同的密钥.
第三种选择是妥协的产物,但有时我希望在为其他项目部署小补丁时保持本地数据不变.
我知道这可能是Redis的功能请求,但我现在需要一个解决方案.
任何想法,做法?
从Rails 3.0开始,我不时收到这样的异常通知:
ActionView::MissingTemplate: Missing template [...] with {:locale=>[:en],
:formats=>[:text], :handlers=>[:erb, :builder, :haml]}. Searched in: * [...]
Run Code Online (Sandbox Code Playgroud)
例如,像http://example.com/some/path/robots.txt这样的任意手写URL 会引发错误.不好玩.
很久以前我在这张票中报告了这个问题,并且一直在使用这里提到的补丁,但问题仍然存在.
此博客文章中建议修复,
http://trevorturk.wordpress.com/2011/12/09/handling-actionviewmissingtemplate-exceptions/
要使用它:
respond_to do |format|
format.js
end
Run Code Online (Sandbox Code Playgroud)
但它对我来说并不合适,因为我对使用多种格式重载动作不感兴趣.在我的应用程序中,HTML和JSON API有单独的URL,所以简单render就足够了.
我应该吞下异常rescue_from ActionView::MissingTemplate并自己返回406吗?
有没有更好的方法来处理这种情况?
或者我可以这样问 - 首先,在生产中提出这种例外是否有任何实际用处?
这是我们的基本要求:
为此,我可以看到实现该目标的几个选项:
Rails::EngineRails::Application最明显的答案是Git分支,具有完全的灵活性.
但是我不确定这是不是一个好主意,因为代码库基本上是共享的,主线有更多的活动 - 赶上rebase/merge可能只是额外的麻烦.
我们希望尽可能地将原始版本和自定义版本分离.换句话说,我们希望在原始和定制之间尽可能减少冲突.
Rails::Engine或者Rails::Application似乎是一个很接近的想法(我不熟悉Rails引擎),但我不明白如何拥有OurApp::Application和OurCustomizedApp::Application在一个地方,并在全球和动态之间切换它们.
有可能会很高兴:
RAILS_APPconfig/database.yml是config/customer1/database.ymldeploy.rb对Capistrano的(可能与config/servers.yml和config/customer1/servers.yml定义角色和IP?)是否有针对我们要求的做法/惯例?有什么建议?
我们的应用程序运行在Ruby 1.9.2 + Rails 3.0.3上.
UPDATE
我们把它作为Git分支开始.我们创建了一个rake任务来生成一个文件,config/branch其中包括"master"或"custom"等文本,application.rb在bootstrap时读取它.配置喜欢database.yml或servers.yml现在住在config/mainline/或config/customized/,application.rb相应地处理它们.
config.paths.config.database = "config/#{branch}/database.yml"
Run Code Online (Sandbox Code Playgroud)
不完美,但现在还不错.当我们找到更好的方法时,我会更新.
这可能听起来像是一个代码高尔夫问题,但最简单/最轻的回归方式$remote_addr是text/plain什么?
因此,它应该以纯文本形式返回IP地址的几个字节.
216.58.221.164
Run Code Online (Sandbox Code Playgroud)
使用案例:用于学习客户端自己的外部(NAT)全局IP地址的API.
是否有可能单独使用Nginx并且没有任何后端?如果是这样,怎么样?
我想知道在MySQL + Rails上存储纬度/经度的最佳列类型是什么.
来自谷歌的官方文件:
http://code.google.com/apis/maps/articles/phpsqlajax_v3.html
使用Google地图的当前缩放功能,您应该只需要小数点后的6位精度.要将表所需的存储空间保持在最小,可以指定lat和lng属性是大小为浮点数(10,6).这将使字段在小数点后存储6位数,加上小数点前最多4位数,例如-123.456789度.
所以,实际上FLOAT(10,6)是谷歌推荐的.
但是,使用Rails 3,似乎没有简单的方法来FLOAT在小数点后精确定义列类型.例如,您可以使用原始SQL编写迁移,如下所示:
def self.up
execute <<-SQL
ALTER TABLE places
ADD `lat` FLOAT(10,6),
ADD `lng` FLOAT(10,6)
SQL
add_index :places, [ :lat, :lng ]
end
Run Code Online (Sandbox Code Playgroud)
但schema.rb结果将如下所示:
t.float "lat", :limit => 10
t.float "lng", :limit => 10
Run Code Online (Sandbox Code Playgroud)
这缺少了小数部分的精度.
在这里,我可以看到几个选项:
FLOAT(10,6)以达到最佳生产性能,不转储模式(如rake db:test:load开发).DECIMAL(10,6),由Rails支持,但它需要6个字节,大于1.5倍FLOAT(参见:http://dev.mysql.com/doc/refman/5.1/en/storage-requirements.html).也许这将是一个很好的妥协?DOUBLE,比Google的要求更宽敞,占用8个字节,比2倍大FLOAT.它也很简单.你的建议是什么?
mysql optimization ruby-on-rails geolocation latitude-longitude
这是代码:
class M
include Mongoid::Document
field :name
end
params = { name: "foo", age: 20 }
M.create(params)
#=> #<M name: "My Name", age: 20>
Run Code Online (Sandbox Code Playgroud)
请注意,age未定义但已保存.
这是有问题的(可能是DoS的来源),因为恶意用户可以在POST中添加任何参数,并且大字符串可以潜入未知字段.(例如name=foo&bogus=#{'x'*1000000})
到目前为止,我无法找到任何东西,但attr_accessible,但你必须保持在两个相同的字段名称它不是Mongoid真正伟大field和attr_accessible所有的时间,所有车型.不干.
我认为attr_accessibleAPI非常适合ActiveRecord,因为有一个.您没有明确定义模型(DRY)和b中的字段.保证不存在将不存在的字段保存到RDB的可能性.但对于Mongoid,我认为应该有一个更好的解决方案attr_accessible.
请注意,有一个全局配置设置,allow_dynamic_fields但它不是关于质量分配,所以它超出了本讨论的范围,但是我认为它实际上应该是一个每个模型的宏,并且还应该注意质量分配.
你是如何处理这个问题的?
自从我从Rails 3.0.11迁移到3.1.3后,我发现了一个奇怪的错误.这是一个重现错误的独立代码:
require 'active_record'
ActiveRecord::Base.establish_connection(
:adapter => 'mysql2',
:username => 'root',
:database => "some_development"
)
class User < ActiveRecord::Base
has_many :favorites
end
class Favorite < ActiveRecord::Base
belongs_to :user
end
u = User.create
# f = u.favorites.find_or_create_by_site_id(123) #=> pass
f = u.favorites.find_or_initialize_by_site_id(123) #=> fail
f.some_attr = 'foo'
f.save!
u.name = 'bar'
u.save! # ActiveRecord::RecordNotUnique will be thrown here!
Run Code Online (Sandbox Code Playgroud)
最终会ActiveRecord::RecordNotUnique尝试INSERT将相同的记录放到favorites桌面上.(请注意,对于此示例,(user_id,site_id)对在收藏夹中必须是唯一的)
有趣的是,如果我使用find_or_create而不是find_or_initialize没有异常被提出.
在堆栈跟踪中,我注意到autosave_association被调用,不知道为什么,但实际上也has_many :favorites, :autosave => false没有has_many :favorites …
activerecord autosave ruby-on-rails associations ruby-on-rails-3.1
更新:看起来像TimWolla评论的浏览器特定行为 - 我应该如何以跨浏览器的方式可靠地规范化非转义版本?
HTML:
<div id="test"><a href="#{one}">#{two}</a></div>
Run Code Online (Sandbox Code Playgroud)
JS:
$('#test').html()
=> <a href="#%7Bone%7D">#{two}</a>
Run Code Online (Sandbox Code Playgroud)
请注意#{one},href中的内容是转义的,而#{two}不是.
有没有比unescape整个字符串更好的方法?
unescape($('#test').html())
=> <a href="#{one}">#{two}</a>
Run Code Online (Sandbox Code Playgroud)
这是一个例子:http://jsfiddle.net/kenn/n8veL/
我们可以在Ruby上分配一个线程局部变量,如下所示:
Thread.current[:foo] = 1
Thread.current[:bar] = 2
Run Code Online (Sandbox Code Playgroud)
但是我们如何在以后列出/枚举这些变量呢?
给出以下代码:
module Foo
extend ActiveSupport::Concern
module ClassMethods
def foo
puts 'foo'
end
end
end
class Bar
include Foo
end
Run Code Online (Sandbox Code Playgroud)
我想做的是打电话Foo.foo而不是Bar.foo.有时在原始模块上调用类方法会更自然,特别是当功能与包含的类无关时,更好地与原始模块名称一起描述.
我为每个服务器运行10个Unicorn工作程序,随着时间的推移他们吃掉所有MySQL连接,结果是"连接太多"错误.它从10个连接开始,但逐渐增加到20个.
当我在生产(使用SHOW PROCESSLIST)上运行以下脚本时,我可以看到每个IP(=应用程序服务器)每个都有20个连接,它应该是10 - 令Unicorn worker的数量增加了两倍.
result = ActiveRecord::Base.connection.execute 'show processlist'
result.group_by{|i| i[2].split(':').first }.map{|k,v| [k, v.size] }
=> [["192.168.1.2", 20], ["192.168.1.3", 20], ["192.168.1.4", 20], ... ]
Run Code Online (Sandbox Code Playgroud)
这是database.yml
production:
adapter: mysql2
...
pool: 1
Run Code Online (Sandbox Code Playgroud)
这是netstat:
# netstat -an | grep :3306
tcp 0 0 192.168.1.2:58535 192.168.1.123:3306 ESTABLISHED
tcp 0 0 192.168.1.2:45021 192.168.1.123:3306 ESTABLISHED
tcp 0 0 192.168.1.2:58537 192.168.1.123:3306 ESTABLISHED
tcp 0 0 192.168.1.2:45119 192.168.1.123:3306 TIME_WAIT
...
# netstat -an | grep :3306 | wc -l
36
# netstat -an …Run Code Online (Sandbox Code Playgroud) activerecord ×3
mysql ×2
ruby ×2
templates ×2
associations ×1
autosave ×1
exception ×1
geolocation ×1
iphone ×1
jquery ×1
mongoid ×1
networking ×1
nginx ×1
optimization ×1
redis ×1
spoofing ×1
udid ×1
unicorn ×1