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_forcontent_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在主机上传[关闭]

如何在 ruby​​ on rails 中访问 rails 助手和嵌入资产 javascript 文件中的 ruby​​?