小编ken*_*enn的帖子

使用Rails 4时,不推荐使用Model.scoped,但Model.all不能替换它

Model.scoped现在不推荐使用Rails 4 .

DEPRECATION WARNING: Model.scoped is deprecated. Please use Model.all instead.

但是,有一个区别Model.scopedModel.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)

activerecord ruby-on-rails-4

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

在运行时检测iPhone上的UDID欺骗

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)

iphone spoofing udid

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

具有多个项目的开发机器上的Redis数据库

当一些项目使用Redis数据库时,如何管理开发和/或测试机器上的多个项目?

有两个主要问题:

  1. Redis没有命名数据库(仅限0-16)
  2. 测试可能会在每次运行时执行FLUSHDB

现在,我认为我们有三种选择:

  1. 为每个项目,每个开发和测试环境分配不同的数据库
  2. 带有项目名称的前缀键使用类似的东西 redis-namespace
  3. 只要在项目之间切换,就可以对数据库进行Nuke和种子化

如果多个项目为主要用途分配"0"而对于测试等分配"1"则第一个是有问题的.即使项目B决定改为"2"和"3",项目中的另一名成员也可能在另一个项目中与他发生冲突.换句话说,这种方法不是SCM友好的.

对于第二个,这只是一个坏主意,因为它在运行时性能和内存效率上增加了不必要的开销.无论你做什么,当你加入这个项目时,另一个项目可能已经巧合地使用了相同的密钥.

第三种选择是妥协的产物,但有时我希望在为其他项目部署小补丁时保持本地数据不变.

我知道这可能是Redis的功能请求,但我现在需要一个解决方案.

任何想法,做法?

redis

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

抑制Rails 3.x的ActionView :: MissingTemplate异常

从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 会引发错误.不好玩.

很久以前我在这张票中报告了这个问题,并且一直在使用这里提到的补丁,但问题仍然存在.

https://rails.lighthouseapp.com/projects/8994/tickets/6022-content-negotiation-fails-for-some-headers-regression

此博客文章中建议修复,

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吗?

有没有更好的方法来处理这种情况?

或者我可以这样问 - 首先,在生产中提出这种例外是否有任何实际用处?

templates ruby-on-rails exception

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

运行Rails应用程序的自定义版本

这是我们的基本要求:

  • 我们有一个基础Rails应用程序,正在积极维护.
  • 我们希望提供此应用程序的自定义版本,因为:
    • 服务器必须驻留在我们客户的前提下,并在不同的域上运行.
    • 有一个特定的日志记录工具,用于在数据中心内进行监控.

为此,我可以看到实现该目标的几个选项:

  • Git分支
  • Rails::Engine
  • Rails::Application

最明显的答案是Git分支,具有完全的灵活性.

但是我不确定这是不是一个好主意,因为代码库基本上是共享的,主线有更多的活动 - 赶上rebase/merge可能只是额外的麻烦.

我们希望尽可能地将原始版本和自定义版本分离.换句话说,我们希望在原始和定制之间尽可能减少冲突.

Rails::Engine或者Rails::Application似乎是一个很接近的想法(我不熟悉Rails引擎),但我不明白如何拥有OurApp::ApplicationOurCustomizedApp::Application在一个地方,并在全球和动态之间切换它们.

有可能会很高兴:

  • 自定义初始化程序,控制器和视图在一个单独的目录中覆盖(或修补)原始
  • 能够指定由环境变量引导的应用程序(原始应用程序或自定义应用程序) RAILS_APP
  • 单独的配置文件,如下所示:config/database.ymlconfig/customer1/database.yml
  • 使用相同的能力,deploy.rb对Capistrano的(可能与config/servers.ymlconfig/customer1/servers.yml定义角色和IP?)

是否有针对我们要求的做法/惯例?有什么建议?

我们的应用程序运行在Ruby 1.9.2 + Rails 3.0.3上.

UPDATE

我们把它作为Git分支开始.我们创建了一个rake任务来生成一个文件,config/branch其中包括"master"或"custom"等文本,application.rb在bootstrap时读取它.配置喜欢database.ymlservers.yml现在住在config/mainline/config/customized/,application.rb相应地处理它们.

config.paths.config.database = "config/#{branch}/database.yml"
Run Code Online (Sandbox Code Playgroud)

不完美,但现在还不错.当我们找到更好的方法时,我会更新.

ruby-on-rails ruby-on-rails-3

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

Nginx:直接在text/plain中返回$ remote_addr

这可能听起来像是一个代码高尔夫问题,但最简单/最轻的回归方式$remote_addrtext/plain什么?

因此,它应该以纯文本形式返回IP地址的几个字节.

216.58.221.164
Run Code Online (Sandbox Code Playgroud)

使用案例:用于学习客户端自己的外部(NAT)全局IP地址的API.

是否有可能单独使用Nginx并且没有任何后端?如果是这样,怎么样?

networking nginx

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

Rails和MySQL上纬度和经度的最佳列类型

我想知道在MySQL + Rails上存储纬度/经度的最佳列类型是什么.

  • 精度必须足以存储从移动设备和/或地理编码器获得的每一位lat/lng度.
  • 存储要求应该是最小的,以获得最佳查询性能.

来自谷歌的官方文件:

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

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

Mongoid:如何防止通过批量分配创建未定义的字段?

这是代码:

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真正伟大fieldattr_accessible所有的时间,所有车型.不干.

我认为attr_accessibleAPI非常适合ActiveRecord,因为有一个.您没有明确定义模型(DRY)和b中的字段.保证不存在将不存在的字段保存到RDB的可能性.但对于Mongoid,我认为应该有一个更好的解决方案attr_accessible.

请注意,有一个全局配置设置,allow_dynamic_fields但它不是关于质量分配,所以它超出了本讨论的范围,但是我认为它实际上应该是一个每个模型的宏,并且还应该注意质量分配.

你是如何处理这个问题的?

ruby-on-rails mass-assignment mongoid

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

find_or_initialize_by on has_many关联会导致重复错误

自从我从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

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

如何防止jQuery .html()自动转义href属性?

更新:看起来像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/

jquery templates

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

在Ruby中列出线程局部变量

我们可以在Ruby上分配一个线程局部变量,如下所示:

Thread.current[:foo] = 1
Thread.current[:bar] = 2
Run Code Online (Sandbox Code Playgroud)

但是我们如何在以后列出/枚举这些变量呢?

ruby

4
推荐指数
1
解决办法
1692
查看次数

使用ActiveSupport :: Concern使ClassMethods也可用作模块功能

给出以下代码:

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.有时在原始模块上调用类方法会更自然,特别是当功能与包含的类无关时,更好地与原始模块名称一起描述.

ruby ruby-on-rails activesupport

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

Unicorn和Rails占用了2倍的MySQL连接

我为每个服务器运行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)

mysql activerecord ruby-on-rails unicorn

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