假设我有一个名为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(与外部系统集成等)的情况.
有人可以描述ERB文件中使用的以下字符的用法:
<% %>
<%= %>
<% -%>
<%# %>
Run Code Online (Sandbox Code Playgroud)
每个人的用法是什么?
我想要Bundler加载本地gem.那有选择吗?或者我是否必须将gem文件夹移动到.bundle目录中?
什么bundle exec rake db:migrate意思?或者只是bundle exec rake <command>一般?
据我所知,bundle它负责维护Gemfile中的内容.我知道"exec"这个词是什么意思.我明白,rake你可以保留所有不同的脚本,我知道这db:migrate就是其中之一.我只是不知道这些话在一起做什么.为什么要bundle用来rake执行数据库迁移?
这更像是"为什么这样做的事情"这个问题,而不是"我不知道该怎么做"这个问题......
所以关于拉动你知道你将要使用的相关记录的福音就是使用,: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的是认识到性能问题,并除非在某些情况下,不加入呢?
我在我的Scss文件中配置了一些字体,如下所示:
@font-face {
font-family: 'Icomoon';
src: asset-url('icoMoon.eot?#iefix', font) format('embedded-opentype'),
asset-url('icoMoon.woff', font) format('woff'),
asset-url('icoMoon.ttf', font) format('truetype'),
asset-url('icoMoon.svg#Icomoon', font) format('svg');
}
Run Code Online (Sandbox Code Playgroud)
实际的字体文件存储在/ app/assets/fonts /中
我已经添加config.assets.paths << Rails.root.join("app", "assets", "fonts")到我的application.rb文件中
编译CSS源代码如下:
@font-face {
font-family: 'Icomoon';
src: url(/assets/icoMoon.eot?#iefix) format("embedded-opentype"), url(/assets/icoMoon.woff) format("woff"), url(/assets/icoMoon.ttf) format("truetype"), url(/assets/icoMoon.svg#Icomoon) format("svg");
}
Run Code Online (Sandbox Code Playgroud)
但是当我运行应用程序时,找不到字体文件.日志:
开始获取"/assets/icoMoon.ttf"为127.0.0.1在2012-06-05 23:21:17 +0100服务资产/icoMoon.ttf - 404未找到(13ms)
为什么资产管道没有将字体文件缩小为just/assets?
人们有什么想法?
亲切的问候,尼尔
额外信息:
在检查rails控制台的资产路径和assetprecompile时,我得到以下内容:
1.9.2p320 :001 > y Rails.application.config.assets.precompile
---
- !ruby/object:Proc {}
- !ruby/regexp /(?:\/|\\|\A)application\.(css|js)$/
- .svg
- .eot
- .woff
- .ttf
=> nil
1.9.2p320 :002 > …Run Code Online (Sandbox Code Playgroud) 我想知道如何将自定义配置变量添加到rails应用程序以及如何在控制器中访问它们,例如我想能够在配置文件中定义upload_directory,例如development.rb并且能够在我的一个中访问它控制器.
其次我计划在我的应用程序中为上传提供S3支持,如果我想添加带有s3访问,密钥的yaml文件,如何在我的Rails应用程序中初始化它以及如何访问我定义的值在该配置文件中.
在扶手> 4.0.0发电机,创建CRUD操作before_action没有before_filter.它似乎做同样的事情.那么这两者之间的区别是什么?
我们最近遇到了一个问题,即在发生一系列提交后,后端进程无法运行.现在,我们都是优秀的小男孩和女孩,并rake test在每次办理登机手续后都跑了,但由于Rails图书馆装载中的一些奇怪现象,它只发生在我们直接从生产模式中的Mongrel运行时.
我追踪了这个错误,这是因为一个新的Rails gem以一种破坏运行时Rails代码中一个狭隘用法的方式覆盖了String类中的一个方法.
无论如何,长话短说,有没有办法在运行时询问Ruby在哪里定义了一个方法?这样的whereami( :foo )回归/path/to/some/file.rb line #45?在这种情况下,告诉我它是在类String中定义的将是无益的,因为它被某些库重载.
我不能保证源代码存在于我的项目中,因此grepping 'def foo'不一定会给我我需要的东西,更不用说我是否有很多东西 def foo,有时候直到运行时我才知道我可能正在使用哪一个.
我是Rails的新手,所以我目前的项目处于一种奇怪的状态.
我生成的第一件事是"电影"模型.然后我开始更详细地定义它,添加了一些方法等.
我现在意识到我应该生成它rails generate scaffold来连接诸如路由,视图,控制器等的东西.
我试图生成脚手架,但我收到一个错误,说已存在同名的迁移文件.
现在为我的"电影"创建脚手架的最佳方式是什么?(使用导轨3)