我刚刚更新到rails 4.0.2并且我收到此警告:
[已弃用] I18n.enforce_available_locales将来默认为true.如果您确实想跳过语言环境的验证,可以设置I18n.enforce_available_locales = false以避免此消息.
将其设置为false是否存在任何安全问题?
如何从ActiveRecord对象获取类名?
我有:
result = User.find(1)
Run Code Online (Sandbox Code Playgroud)
我试过了:
result.class
# => User(id: integer, name: string ...)
result.to_s
# => #<User:0x3d07cdc>"
Run Code Online (Sandbox Code Playgroud)
我只需要一个字符串中的类名(User
在本例中).有没有办法呢?
我知道这是非常基本的,但我搜索了Rails和Ruby的文档,我找不到它.
假设我有一个名为Thing的Rails模型.Thing有一个url属性,可以选择将其设置为Internet上的某个URL.在视图代码中,我需要执行以下操作的逻辑:
<% if thing.url.blank? %>
<%= link_to('Text', thing_path(thing)) %>
<% else %>
<%= link_to('Text', thing.url) %>
<% end %>
Run Code Online (Sandbox Code Playgroud)
视图中的这种条件逻辑很难看.当然,我可以构建一个辅助函数,它会将视图更改为:
<%= thing_link('Text', thing) %>
Run Code Online (Sandbox Code Playgroud)
这解决了冗长问题,但我真的更喜欢模型本身的功能.在这种情况下,视图代码将是:
<%= link_to('Text', thing.link) %>
Run Code Online (Sandbox Code Playgroud)
显然,这需要模型上的链接方法.这是它需要包含的内容:
def link
(self.url.blank?) ? thing_path(self) : self.url
end
Run Code Online (Sandbox Code Playgroud)
就问题而言,thing_path()是Model代码中未定义的方法.我假设可以将一些辅助方法"拉入"模型中,但是如何?是否有一个真正的原因,路由只在控制器上运行并查看应用程序层?我可以想到许多模型代码可能需要处理URL(与外部系统集成等)的情况.
这更像是"为什么这样做的事情"这个问题,而不是"我不知道该怎么做"这个问题......
所以关于拉动你知道你将要使用的相关记录的福音就是使用,:include
因为你将获得一个连接并避免一大堆额外的查询:
Post.all(:include => :comments)
Run Code Online (Sandbox Code Playgroud)
但是,当您查看日志时,没有发生加入:
Post Load (3.7ms) SELECT * FROM "posts"
Comment Load (0.2ms) SELECT "comments.*" FROM "comments"
WHERE ("comments".post_id IN (1,2,3,4))
ORDER BY created_at asc)
Run Code Online (Sandbox Code Playgroud)
它正在采取一种捷径,因为它会立即提取所有注释,但它仍然不是连接(这是所有文档似乎都说的).我可以获得连接的唯一方法是使用:joins
而不是:include
:
Post.all(:joins => :comments)
Run Code Online (Sandbox Code Playgroud)
日志显示:
Post Load (6.0ms) SELECT "posts".* FROM "posts"
INNER JOIN "comments" ON "posts".id = "comments".post_id
Run Code Online (Sandbox Code Playgroud)
我错过了什么吗?我有一个有六个关联的应用程序,在一个屏幕上我显示所有这些数据.似乎最好有一个加入查询而不是6个人.我知道在性能方面,进行连接而不是单个查询并不总是更好(事实上,如果你花费时间,看起来上面的两个单独的查询比连接更快),但是在所有文档之后我一直在阅读,我很惊讶地看到:include
不像宣传的那样工作.
也许Rails的是认识到性能问题,并除非在某些情况下,不加入呢?
我有一个rake任务,我在开始时做一些检查,如果其中一个检查失败,我想从rake任务提前返回,我不想执行任何剩余的代码.
我认为解决方案是在我希望从代码返回的地方放置一个返回但是我得到以下错误
unexpected return
Run Code Online (Sandbox Code Playgroud) 我正在开发一个API客户端,我需要根据请求对JSON有效负载进行编码,并从响应中解码JSON主体.
我已经阅读了几个库的源代码,从我看到的,我基本上有两种编码和解码JSON字符串的可能性.
使用json.Unmarshal
传递整个响应字符串
data, err := ioutil.ReadAll(resp.Body)
if err == nil && data != nil {
err = json.Unmarshal(data, value)
}
Run Code Online (Sandbox Code Playgroud)
或使用 json.NewDecoder.Decode
err = json.NewDecoder(resp.Body).Decode(value)
Run Code Online (Sandbox Code Playgroud)
在我的情况下,当处理实现的HTTP响应时,io.Reader
第二个版本似乎需要更少的代码,但是因为我已经看到两者我想知道是否有任何偏好我是否应该使用解决方案而不是另一个.
此外,从这个问题接受的答案说
请使用
json.Decoder
而不是json.Unmarshal
.
但它没有提到原因.我真的应该避免使用json.Unmarshal
吗?
如果我创建一个新的rails 3迁移(例如)
rails g migration tester title:tester user:references
Run Code Online (Sandbox Code Playgroud)
,一切正常......但是,如果我添加一个包含以下内容的列:
rails g migration add_user_to_tester user:references
Run Code Online (Sandbox Code Playgroud)
参考字段无法识别.简而言之,问题是:如何从命令行向rails迁移添加引用列?
在哪里可以找到可在rails 3中使用的数据类型列表?(例如文本,字符串,整数,浮点数,日期等?)我会随机了解新的,但我希望有一个我可以轻松参考的列表.
我正在升级到Rails 3.2,运行rake db:migrate会给我带来几个错误:
弃用警告:您在供应商/插件中拥有Rails 2.3风格的插件!在Rails 4.0中将删除对这些插件的支持.移出它们并将它们捆绑在Gemfile中,或者将它们作为lib/myplugin/*和config/initializers/myplugin.rb折叠到您的应用程序中.有关详细信息,请参阅发行说明:http://weblog.rubyonrails.org/2012/01/04/rails-3-2-0-rc2-has-been-released.(从/ app/Rakefile调用:7)
令人困惑的是我的vendor/plugins
目录是空的 - 是否有另一个引用的插件目录?
我没有Mercurial的丰富经验,我主要是Git家伙.
我想在git Repository中镜像一个特定的Mercurial文件夹/文件.我实际上要做的是将文件的历史记录从Mercurial存储库导出到Git,并能够与未来的提交保持同步.
你对如何进行有任何建议吗?我相信要走的路应该是获取Mercurial补丁的历史记录,定期将每个提交作为补丁导出,并将Mercurial补丁应用于Git存储库.
ruby ×5
activerecord ×1
database ×1
deprecated ×1
git ×1
go ×1
heroku ×1
join ×1
json ×1
mercurial ×1
migration ×1
rails-i18n ×1
rake ×1