Ruby on Rails 的隐藏特性 [关闭]
Posted
技术标签:
【中文标题】Ruby on Rails 的隐藏特性 [关闭]【英文标题】:Hidden Features of Ruby on Rails [closed] 【发布时间】:2010-10-17 02:49:31 【问题描述】:作为Hidden features of Ruby 的伴侣。
尽量将它保留在 Rails 中,因为另一个是 Ruby 特定示例的更好地方。请每个帖子一个。
【问题讨论】:
这个问题怎么会有答案?我看到你已经标记了一个。 确实如此。我只选择了一个,因为它抱怨我开始赏金。但你是对的。我把它取下来了。 为什么这个问题没有像 e.g. ***.com/questions/550632/… ?投票少,答案少...... 【参考方案1】:我将从我最喜欢的一个开始。当使用集合调用部分时,您可以使用以下命令:
render :partial => 'items', :collection => @items
这将为每个项目调用一次部分,并每次传递一个局部变量项目。您也不必担心检查 @items 的 nil。
【讨论】:
对于上面的例子,你必须部分命名为集合对象的模型名称。如果您有不同名称的部分,例如foo
,则可以使用render :partial => 'foo', :collection => @items, as: :item
。现在你得到了名为item
的对象,其中foo
部分。【参考方案2】:
Rails 2.3.x 现在允许您执行以下操作:
render @items
简单多了..
【讨论】:
不错的一个!我们还没有玩过 2.3 - 我们在 railsconf 等待 3.0 澄清一下:这将呈现一个名为“项目”的部分? @Matt,是的 - 我是按照前面的示例进行的,它使用了一个名为 @items 的集合。显然,视图需要正确命名才能让这种魔法发挥作用。 使用这种语法,rails 不查找具有单数名称的部分吗?例如"_item.html.erb"【参考方案3】:integer.ordinalize 是我不久前偶然发现的一个小方法。
1.ordinalize = "1st"
3.ordinalize = "3rd"
【讨论】:
Edge Rails (4.0.beta) 有一个相关的方法'ordinal',它只返回后缀。 1.ordinal 返回“st”,34.ordinal 返回“th”,以此类推。【参考方案4】:如果为资源添加路由:
ActionController::Routing::Routes.draw do |map|
map.resources :maps
end
并注册额外的 mime 类型:
Mime::Type.register 'application/vnd.google-earth.kml+xml', :kml
您不需要在控制器中使用 respond_to
块来服务这些额外的类型。相反,只需为特定类型创建视图,例如 'show.kml.builder'
或 'index.kml.erb'
。当收到'/maps.kml'
或'/maps/1.kml'
的请求时,Rails 将呈现这些特定于类型的模板,并适当地设置响应类型。
【讨论】:
【参考方案5】:如果您的模型具有一些类方法和一些命名范围:
class Animal < ActiveRecord::Base
named_scope 'nocturnal', :conditions => 'nocturnal' => true
named_scope 'carnivorous', :conditions => 'vegetarian' => true
def self.feed_all_with(food)
self.all.each do |animal|
animal.feed_with(food)
end
end
end
然后就可以通过命名作用域调用类方法了:
if night_time?
Animal.nocturnal.carnivorous.feed_all_with(bacon)
end
【讨论】:
显然你的肉食动物是素食者?【参考方案6】:您可以利用 Ruby 类定义处于活动状态以及 Rails 在生产环境中缓存类这一事实,以确保仅在应用程序启动时从数据库中获取常量数据。
例如,对于代表国家/地区的模型,您需要定义一个常量,在加载类时执行Country.all
查询:
class Country < ActiveRecord::Base
COUNTRIES = self.all
.
.
.
end
您可以通过引用Country::COUNTRIES
在视图模板中(可能在选择助手中)使用此常量。例如:
<%= select_tag(:country, options_for_select(Country::COUNTRIES)) %>
【讨论】:
【参考方案7】:要查看已安装的 gem 列表,您可以运行:
gem server
然后将浏览器指向:
http://localhost:8808
您将获得格式精美的 gem 列表,其中包含指向 rdoc、Web 和任何依赖项的链接。比:
gem list
【讨论】:
+1。漂亮整洁!我曾经玩过“gem search -l”,这绝对是一个更好的选择。 这不是 Rails 特定的,是吗?只是指出,因为您在问题中提到了另一个与 Ruby 相关的线程。 这似乎很有趣....【参考方案8】:在您的 environment.rb 中,您可以定义新的日期/时间格式,例如
[Time::DATE_FORMATS, Date::DATE_FORMATS].each do |obj|
obj[:dots] = "%m.%d.%y"
end
那么在你的观点中你可以使用:
Created: <%= @my_object.created_at.to_s(:dots) %>
将打印如下:
Created: 06.21.09
【讨论】:
【参考方案9】:为避免重复提交表单,Rails 提供了一个不错的提交标签选项:
submit_tag "Submit", :disable_with => "Saving..."
这会向提交按钮添加行为以在单击后禁用它,并显示“正在保存...”而不是“提交”。
Rails 4+
DEPRECATION WARNING: :disable_with option is deprecated and
will be removed from Rails 4.1. Use 'data: disable_with: 'Text' ' instead.
这样就变成了:
submit_tag 'Submit', data: disable_with: 'Text'
【讨论】:
我的最爱之一,虽然我发现它以某种方式破坏了一些 javascript 验证器。 如果你使用ajax提交,会重新启用吗? 真的很酷!不知道 太棒了....谢谢哥们 如果您使用的是 simple_form gem,我发现this tip 有助于全面应用disable_with
功能。【参考方案10】:
ActionView::Base.default_form_builder = MyFormBuilderClass
在您创建自己的表单构建器时非常有用。手动传递 :builder 的更好选择,无论是在您的视图中还是在您自己的 custom_form_for
助手中。
【讨论】:
【参考方案11】:我目前爱上了div_for
和content_tag_for
<% div_for(@comment) do %>
<!-- code to display your comment -->
<% end %>
上面的代码呈现了这个:
<div id="comment_123" class="comment">
<!-- code to display your comment -->
</div>
希望 CSS 类为 comment other_class
?没问题:
<% div_for(@comment, :class => 'other_class') do %>
<!-- code to display your comment -->
<% end %>
想要一个跨度而不是一个 div?没问题,content_tag_for
来救援!
<% content_tag_for(:span, @comment) do %>
<% end %>
# Becomes...
<span id="comment_123" class="comment">
<!-- code to display your comment -->
</span>
content_tag_for
如果你想给你添加前缀id
也很好。我用它来加载 gif。
<% content_tag_for(:span, @comment, 'loading') do %>
<%= image_tag 'loading.gif' -%>
<% end %>
# Becomes...
<span id="loading_comment_123" class="comment">
<img src="loading.gif" />
</span>
【讨论】:
【参考方案12】:返回块是返回值的好方法:
def returns_a_hash(id)
returning Hash.new do |result|
result["id"] = id
end
end
将返回一个哈希值。您也可以替换任何其他类型。
【讨论】:
一点也不喜欢!目前尚不清楚它最终会返回什么。它在 rails 3 重构中被避免了。 太糟糕了——我一直觉得它很酷。 Ruby 中的 K 组合运算符,这很酷。【参考方案13】:您可以为您的测试套件更改模型的行为。假设您定义了一些 after_save 方法,并且您不希望它在单元测试中发生。它是这样工作的:
# models/person.rb
class Person < ActiveRecord::Base
def after_save
# do something useful
end
end
# test/unit/person_test.rb
require 'test_helper'
class PersonTest < ActiveSupport::TestCase
class ::Person
def after_save
# do nothing
end
end
test "something interesting" do
# ...
end
end
【讨论】:
【参考方案14】:有趣的特点是数组有特殊的方法来访问它的 42 个元素
a = []
a.forty_two
http://railsapi.com/doc/rails-v2.3.8/classes/ActiveSupport/CoreExtensions/Array/Access.html#M003045
【讨论】:
现在看来这个方法在 ruby 1.9.3 中不存在 @RameshwarVyevhare,检查 Rails 不是 Ruby 哦抱歉....我想在 ruby 中...!【参考方案15】:以编程方式使用 rake 路由打印所有内容:
Rails.application.routes
【讨论】:
另外,您可以在localhost:3000/rails/info/routes
浏览器上获取所有路由以上是关于Ruby on Rails 的隐藏特性 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章
Ruby on Rails 6 - 如何根据特定路线建模/隐藏视图?
Ruby on Rails - Ruby 中的 KeyCode [关闭]
在 Slim 中使用 Ruby on Rails 有条件地创建隐藏属性
使用 js/jquery 在 ruby on rails 中隐藏 form_tag 上的提交按钮
如何在 ruby on rails 中访问 rails 助手和嵌入资产 javascript 文件中的 ruby?