我有一个简单的桶,看起来像images.mysite.com我的S3和其他包含备份等的桶.
我想允许特定用户访问images.mysite.com存储桶以上传图像.但是,我不希望他看到任何其他的桶; 甚至不存在它们.
我无法制定这样做的政策; 每当我尝试限制性的东西时,它最终会阻止任何桶的列表.
如何通过Mongoid on Rails使用MongoDB编写适当的单元测试(以及针对该问题的集成测试)?
我问,因为与使用让我们说SQLite3相反,即使在运行测试时,我所做的一切仍然存在.所以目前我正在编写创建测试,然后手动删除我所做的一切.但是对于集成测试而言,它变得烦人甚至复杂.
我做的样本:
before(:each) do
@user = User.create!(@attr)
end
after(:each) do
# MongoDB is not a transactional DB, so added objects (create) during tests can't be rollbacked
# checking for the existance of a similar object with exact :name and :email (regex make it case insensitive)
cleanup = User.where(:name => "Example User", :email => /^user@example.com/i)
cleanup.destroy unless cleanup.nil?
end
Run Code Online (Sandbox Code Playgroud)
知道如何在测试期间使MongoDB不持久吗?(我甚至无法在沙箱模式下运行控制台,因为使用Mongoid我必须停用Active Record).
我基本上试图得到这个结果:
<a href="#" class="button small-button green-button">
Log in
<span class="button-right"></span>
</a>
Run Code Online (Sandbox Code Playgroud)
但我不知道如何使用rails 3中的link_to来做到这一点?
这是我的情况,我使用设计允许用户在我的网站上创建帐户并管理他们的身份验证.在注册过程中,我允许客户更改一些选项,从而导致创建一个实际上不同的帐户,但仍然基于相同的核心用户资源.我想选择不发送某些帐户类型的确认电子邮件.我不在乎帐户是否未得到确认且用户无法登录,这没关系,没有pb.我该怎么做呢?谢谢,亚历克斯
我到处都看了一眼,发现了很多信息...但是没有什么对我有用而且我没有得到它:(
我知道你应该覆盖注册控制器,如下所示:
class Users::RegistrationsController < Devise::RegistrationsController
def after_sign_up_path_for(resource)
authors_waiting_path
end
end
Run Code Online (Sandbox Code Playgroud)
然后按照Tony Amoyal http://www.tonyamoyal.com/2010/07/28/rails-authentication-with-devise-andcancan-customizing-devise-controllers/显示的例子,我应该改变我的路线更新新控制器的访问权限:
devise_for :users, :controllers => { :registrations => "users/registrations" } do
#get '/author/sign_up', :to => 'devise/registrations#new'
#get '/client/sign_up', :to => 'devise/registrations#new'
get '/author/sign_up', :to => 'users/registrations#new'
get '/client/sign_up', :to => 'users/registrations#new'
end
Run Code Online (Sandbox Code Playgroud)
是的,我在这里有点奇怪,因为我正在捕捉一些特定的路径将它们发送到注册页面,这使我能够有效地创建2个注册场景.在我覆盖注册控制器之前,我评论了我的内容.
即使所有这些和我的authors_waiting_path是一个有效的路径,它只是在注册后继续进入登录页面:(
这真令人沮丧.
亚历克斯
编辑:我也在设计维基上找到了这个:https://github.com/plataformatec/devise/wiki/How-To : -Redirect- after-registration-(sign- up)
但我不知道在哪里定义这个创建方法?我应该覆盖会话控制器???
编辑2:
我把控制器的虚拟覆盖:
class Pouets::RegistrationsController < Devise::RegistrationsController
def after_sign_up_path_for(resource)
authors_waiting_path
end
def new
super
end
def create
puts "was here"
super
end …Run Code Online (Sandbox Code Playgroud) 出于性能原因,我only()在编写mongoid查询时尽可能多地使用关键字来指定我要加载的字段.
通常的嫌疑人,例如,当我想要所有管理员的用户电子邮件仅用于显示目的时.
我会写:
User.where(:groups => :admins).only(:email).each do |u|
puts u.email
end
Run Code Online (Sandbox Code Playgroud)
我这样做是因为我的用户模型中充满了很多数据,在列出一堆电子邮件时我很乐意忽略这些数据.
但是,现在让我们想象一下,我的用户是通过Project模型引用的,因此对于我可以做的每个项目:project.user.由于mongoid的延迟加载,我的对象用户只有在调用引用时才会被实例化(并从数据库中查询).
但是,如果我想列出所有管理项目所有者的所有电子邮件呢?
我会写这个:
Project.where(:admin_type => true).each do |p|
puts p.user.email
end
Run Code Online (Sandbox Code Playgroud)
这里的主要问题是,这样做,我为每个项目加载整个用户对象,如果有很多项目匹配查询可能会变得非常沉重.那么我该如何只加载电子邮件呢?
我能做到这一点:
User.where(:_id => p.user_id).only(:email).first.email
Run Code Online (Sandbox Code Playgroud)
但这显然打败了简单做法的好语法的目的:
p.user.email
Run Code Online (Sandbox Code Playgroud)
我希望我能写出类似的东西:p.user.only(:email).email但我不能.有任何想法吗 ?
亚历克斯
我想做一些相当简单的事情我相信:
1)仅当该值尚未存在时才在数组字段中插入值
2)删除数组中存在的值
我只是不知道如何做这些事情......目前我只是插入我的值而不检查它是否已经存在:myArray << obj.id
谢谢,
亚历克斯
ps:使用Rails 3.0.3,mongo 1.1.5和mongoid 2.0.0.rc5
ps2:这是实现我想要的mongodb语法,但我不知道如何在mongoid中做到这一点
{ $addToSet : { field : value } }
Run Code Online (Sandbox Code Playgroud)
仅当数组不在数组中时才添加值,如果field是现有数组,否则在字段不存在时将字段设置为数组值.如果字段存在但不是数组,则会引发错误情况.
添加许多valuest.update
{ $addToSet : { a : { $each : [ 3 , 5 , 6 ] } } }
$pop
{ $pop : { field : 1 } }
Run Code Online (Sandbox Code Playgroud)
删除数组中的最后一个元素(1.1中的ADDED)
{ $pop : { field : -1 } }
Run Code Online (Sandbox Code Playgroud)
删除数组中的第一个元素(1.1中的ADDED)|
我有一个在多个服务器上运行的应用程序: - 在开发机器上本地 - 在heroku上 - 在Nginx上使用Passanger的特定服务器上
我试图启动一个特定的代码(加载一些REDIS密钥),只有在启动Web服务器时才需要.
我已经做了很多挖掘,我发现最好的解决方案是在初始化程序中执行我的代码:
if defined?(Rails::Server)
#my code
end
Run Code Online (Sandbox Code Playgroud)
这在本地运行良好,但似乎Rails :: Server永远不会在Heroku或Passanger上定义.
我需要一个适用于所有情况的解决方案,请帮助,这非常重要.
谢谢,
亚历克斯
ps:我正在运行Rails 3.0.4,Ruby 1.8.7
可以在生产环境中激活ruby 1.9.2中的GC :: Profiler会导致性能问题吗?在性能关键的生产应用程序中使用它是否安全?
我正在使用Rails和mongoid与mongodb一起工作.
使用Active:Record时,通常在rails中,您可以访问方法.toggle!它只允许您反转数据库中布尔字段的值.
不幸的是,这种方法不适用于mongoDB:
user = User.first
user.toggle!(:admin)
NoMethodError: undefined method `toggle!' for #<User:0x00000100eee700>
Run Code Online (Sandbox Code Playgroud)
这是不幸的......而且愚蠢到我没有看到如何在没有复杂代码的情况下出行......
关于如何简明扼要地获得相同结果的任何建议?
谢谢,
亚历克斯
PS:还存在的问题之一是,当我要修改字段,它经历再次验证...并且它要求的:密码,我不会在数据库保存,那么:
User.first.admin = !User.first.admin
Run Code Online (Sandbox Code Playgroud)
甚至不会工作:(
mongoid ×4
mongodb ×3
devise ×2
ruby ×2
amazon-s3 ×1
arrays ×1
boolean ×1
bucket ×1
confirmation ×1
email ×1
heroku ×1
href ×1
hyperlink ×1
lazy-loading ×1
link-to ×1
memory ×1
overriding ×1
persistence ×1
policy ×1
profiling ×1
registration ×1
testing ×1
toggle ×1