是否有在Ruby库(gem)或Ruby on Rails应用程序中定义自定义错误类型的最佳实践?特别:
不同的图书馆有不同的做事方式,我没有注意到任何真实的模式.有些库总是使用自定义错误类型,而有些库根本不使用它们; 有些错误扩展了StandardError而其他错误有嵌套层次结构; 有些只是空类定义,有些则有各种巧妙的技巧.
哦,只是因为我觉得调用这些"错误类型"有点含糊不清,我的意思是:
class AuthenticationError < StandardError; end
class InvalidUsername < AuthenticationError; end
Run Code Online (Sandbox Code Playgroud) 这是我想要实现的一个简化示例,我对Rails相对较新,并且正在努力解决模型之间的关系问题.
我有两个模型,User模型和Category模型.用户可以与许多类别相关联.对于许多用户,特定类别可以出现在类别列表中.如果删除了特定类别,则应将其反映在用户的类别列表中.
在这个例子中:
我的Categories表包含五个类别:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ID | Name | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | 1 | Sports | | 2 | News | | 3 | Entertainment | | 4 | Technology | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
我的Users表包含两个用户:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ID | Name | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | 1 | UserA | | 2 | UserB | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
UserA可以选择体育和科技作为他的类别
UserB可以选择新闻,体育和娱乐
删除了体育类别,UserA和UserB类别列表都反映了删除
我玩弄了一个创建一个UserCategories表,其中包含类别和用户的ID.这样的工作,我可以查找类别名称,但我无法得到级联删除工作,整个解决方案似乎错了.
使用我发现的belongs_to和has_many函数的例子似乎讨论了映射一对一的关系.例如,对博客文章的评论.
我有一个非常常见的嵌套路由的情况,我觉得,看起来像这样(在某种伪旋律):
'/:username/photos' => Show photos for User.find_by_username
'/photos' => Show photos for User.all
Run Code Online (Sandbox Code Playgroud)
简而言之:我有用户.他们有照片.我希望能够在他们的页面上显示他们的照片.我也希望能够显示所有照片,无论用户如何.我想保持我的路线RESTful,并使用内置resource方法感觉是正确的方式来做到这一点.
执行此操作的选项1是让PhotosController #index使用条件来检查给出了哪些参数并获取照片列表并设置视图(用户照片与所有照片不同).路由它甚至很容易:
resources :photos, :only => [:index]
scope ':/username' do
resources :photos
end
Run Code Online (Sandbox Code Playgroud)
繁荣.它会看起来像Rails的是设置此.然而,在路线之后,事情变得更加复杂.在PhotosController #index动作中的条件变得越来越臃肿,并且正在进行大量的delgation.随着应用程序的增长以及我想要显示照片的方式的增加,它只会变得更糟.
选项2可能是让User :: PhotosController处理用户照片,以及一个PhotosController来处理显示所有照片.
resources :photos, :only => [:index]
namespace :user, :path => '/:username' do
resources :photos
end
Run Code Online (Sandbox Code Playgroud)
这会产生以下路线:
photos GET /photos(.:format) {:action=>"index", :controller=>"photos"}
user_photos GET /:username/photos(.:format) {:action=>"index", :controller=>"user/photos"}
POST /:username/photos(.:format) {:action=>"create", :controller=>"user/photos"}
new_user_photo GET /:username/photos/new(.:format) {:action=>"new", :controller=>"user/photos"}
edit_user_photo GET /:username/photos/:id/edit(.:format) {:action=>"edit", :controller=>"user/photos"}
user_photo …Run Code Online (Sandbox Code Playgroud) HTTP协议长期支持多部分响应.我以前曾经使用它们用于具有适当装备的消费者的API,但是它们似乎没有对它们的浏览器支持非常好,在过去的五年中也没有改进.我很难找到有关原因的信息.我希望能够通过发送我知道webapp在初始请求中需要的所有资产来减少HTTP请求,特别是对于使用Backbone.js等客户端框架的应用程序.
是否存在任何白皮书,贸易文章,失败的实验或其他证据,说明为什么浏览器制造者或网络性能福音传播者都没有支付这种长期的HTTP构造?
完全清楚,我不是在寻找一个意见,而是一个真实的证据,说明为什么会这样.例如,如果几年前Mozilla发布了一些关于此的内容,或者在Firefox错误跟踪器中有一个已关闭的票证,其中主要开发人员评论他们为什么不实现这一点.
我的登台和生产环境Rails配置是99%相同,只有一些设置不同(例如日志级别),我真的想消除两个环境文件之间的重复.
例如,我有这样的事情:
# config/environments/staging.rb
MyApp::Application.configure do
config.cache_classes = true
config.static_cache_control = "public, max-age=31536000"
config.log_level = :debug
# ...
end
# config/environments/production.rb
MyApp::Application.configure do
config.cache_classes = true
config.static_cache_control = "public, max-age=31536000"
config.log_level = :info
# ...
end
Run Code Online (Sandbox Code Playgroud)
有关创建不影响我的开发环境的共享配置的最佳方法的任何建议?
我已经添加//=require jquery-ui到我的application.js文件,这似乎给了我javascript但我似乎无法得到样式表.如果我理解它应该进入,vendor/stylesheets但我如何将它们包括在内?
我正在使用ActiveAdmin.默认情况下,评论框将显示在显示页面的底部,但在我自定义后,评论框块会消失.
ActiveAdmin.register Book do
scope :all, :default => true
scope :publish
show do
attributes_table :name, :description, :owner, :company, :publish, :publisher
end
end
Run Code Online (Sandbox Code Playgroud)
如何将评论框添加回节目页面?
假设我有一个User模型
paged_users = User.scoped.limit(2).offset(3)
Run Code Online (Sandbox Code Playgroud)
有没有一种方法,使paged_user已经User.scoped通过去除限制和偏移?IE:
all_user = paged_users.remove_limit.remove_offset
Run Code Online (Sandbox Code Playgroud) 我有一个表示对象的哈希数组作为对API调用的响应.我需要从一些哈希中提取数据,并且一个特定的键用作哈希对象的id.我想将数组转换为哈希,键为ids,值为原始哈希值.
这就是我在说的:
api_response = [
{ :id => 1, :foo => 'bar' },
{ :id => 2, :foo => 'another bar' },
# ..
]
ideal_response = {
1 => { :id => 1, :foo => 'bar' },
2 => { :id => 2, :foo => 'another bar' },
# ..
}
Run Code Online (Sandbox Code Playgroud)
我有两种方法可以想到这样做.
ideal_response(下面)api_response.find { |x| x[:id] == i }每个我需要访问记录.map用于构建哈希的方法,本地.我的映射方法:
keys = data.map { |x| x[:id] }
mapped = Hash[*keys.zip(data).flatten]
Run Code Online (Sandbox Code Playgroud)
我不禁感到有一种更高效,更整洁的方式.当需要访问的记录数量非常少时,选项2非常高效.映射优于此处,但当响应中有大量记录时,它会开始崩溃.值得庆幸的是,我不希望有超过50-100条记录,因此映射就足够了. …
我正在使用NewRelic向我的一个Rails应用程序发出一个非常长的请求,发现许多SQL查询看起来完全是外来的,占用了相当长的时间.我已经谷歌了,但我已经空手而归,不管我是否可以防止它们发生.
SELECT COUNT(*) FROM pg_class c LEFT JOIN pg_namespace n ON n.oid = c.relnamespace WHERE c.relkind in (?, ?) AND c.relname = ? AND n.nspname = ANY (current_schemas(false))
Run Code Online (Sandbox Code Playgroud)
…和…
SELECT a.attname, format_type(a.atttypid, a.atttypmod), pg_get_expr(d.adbin, d.adrelid), a.attnotnull, a.atttypid, a.atttypmod FROM pg_attribute a LEFT JOIN pg_attrdef d ON a.attrelid = d.adrelid AND a.attnum = d.adnum WHERE a.attrelid = ?::regclass AND a.attnum > ? AND NOT a.attisdropped ORDER BY a.attnum
Run Code Online (Sandbox Code Playgroud)
...每次发生7次,共计145ms和135ms.
SELECT DISTINCT(attr.attname) FROM pg_attribute attr INNER JOIN pg_depend dep ON attr.attrelid = …Run Code Online (Sandbox Code Playgroud) ruby ×3
activerecord ×1
arrays ×1
browser ×1
conventions ×1
hash ×1
heroku ×1
http ×1
jquery-ui ×1
multipart ×1
newrelic ×1
performance ×1
postgresql ×1
routing ×1
sql ×1
standards ×1