Ruby on Rails的隐藏功能

Bri*_*ian 57 ruby-on-rails

作为Ruby的隐藏功能的伴侣.

尝试将其保留到Rails,因为另一个是特定于Ruby的示例的更好地方.每个帖子请一个.

Jo *_*und 70

为了避免重复的表单提交,Rails有一个很好的提交标签选项:

submit_tag "Submit", :disable_with => "Saving..."
Run Code Online (Sandbox Code Playgroud)

这会向提交按钮添加行为,以便在单击后禁用它,并显示"正在保存..."而不是"提交".

Rails 4+

 DEPRECATION WARNING: :disable_with option is deprecated and 
 will be removed from Rails 4.1. Use 'data: { disable_with: 'Text' }' instead.
Run Code Online (Sandbox Code Playgroud)

因此,上述变为:

submit_tag 'Submit', data: { disable_with: 'Text' }
Run Code Online (Sandbox Code Playgroud)


Dan*_*ade 22

integer.ordinalize是我不久前偶然发现的一个小方法.

1.ordinalize = "1st"
3.ordinalize = "3rd"
Run Code Online (Sandbox Code Playgroud)


Mat*_*nde 21

我目前在爱div_forcontent_tag_for

<% div_for(@comment) do %>
  <!-- code to display your comment -->
<% end %>
Run Code Online (Sandbox Code Playgroud)

上面的代码呈现:

<div id="comment_123" class="comment">
  <!-- code to display your comment -->
</div>
Run Code Online (Sandbox Code Playgroud)

想要CSS课程comment other_class吗?没问题:

<% div_for(@comment, :class => 'other_class') do %>
  <!-- code to display your comment -->
<% end %>
Run Code Online (Sandbox Code Playgroud)

想要跨度而不是div?没问题,content_tag_for救援!

<% content_tag_for(:span, @comment) do %>
<% end %>

# Becomes...

<span id="comment_123" class="comment">
  <!-- code to display your comment -->
</span>
Run Code Online (Sandbox Code Playgroud)

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>
Run Code Online (Sandbox Code Playgroud)


Bri*_*ian 18

要查看已安装的gem列表,您可以运行:

gem server
Run Code Online (Sandbox Code Playgroud)

然后将浏览器指向:

http://localhost:8808
Run Code Online (Sandbox Code Playgroud)

您可以获得格式良好的宝石列表,其中包含指向rdoc,Web和任何依赖项的链接.比以下更好:

gem list
Run Code Online (Sandbox Code Playgroud)

  • 这个不是Rails特有的,是吗?只是指出,因为你在你的问题中提到了另一个与Ruby相关的线程. (7认同)

Joh*_*ley 16

您可以利用Ruby类定义处于活动状态并且Rails在生产环境中缓存类的事实,以确保在应用程序启动时仅从数据库中获取常量数据.

例如,对于表示国家/地区的模型,您可以定义在Country.all加载类时执行查询的常量:

class Country < ActiveRecord::Base
  COUNTRIES = self.all
  .
  .
  .
end
Run Code Online (Sandbox Code Playgroud)

您可以通过引用在视图模板(可能在select帮助器中)中使用此常量Country::COUNTRIES.例如:

<%= select_tag(:country, options_for_select(Country::COUNTRIES)) %>
Run Code Online (Sandbox Code Playgroud)


jem*_*ger 13

在您的environment.rb中,您可以定义新的日期/时间格式,例如

[Time::DATE_FORMATS, Date::DATE_FORMATS].each do |obj|
  obj[:dots] = "%m.%d.%y"
end
Run Code Online (Sandbox Code Playgroud)

那么在你的视图中你可以使用:

Created: <%= @my_object.created_at.to_s(:dots) %>
Run Code Online (Sandbox Code Playgroud)

这将打印如下:

Created: 06.21.09
Run Code Online (Sandbox Code Playgroud)

  • 这个很棒! (2认同)

tom*_*fro 12

如果您的模型包含一些类方法和一些命名范围:

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
Run Code Online (Sandbox Code Playgroud)

然后,您可以通过命名范围调用类方法:

if night_time?
  Animal.nocturnal.carnivorous.feed_all_with(bacon)
end
Run Code Online (Sandbox Code Playgroud)

  • 显然你的食肉动物是素食主义者? (6认同)

小智 8

Rails 2.3.x现在允许您:

render @items
Run Code Online (Sandbox Code Playgroud)

更简单..


Bri*_*ian 7

我将从我最喜欢的一个开始.使用集合调用partial时,可以使用以下代码来循环访问集合并为每个项目调用它:

render :partial => 'items', :collection => @items
Run Code Online (Sandbox Code Playgroud)

这将为每个项目调用一次部分,并且每次都传递一个局部变量项.您也不必担心nil检查@items.


eri*_*ert 5

您可以更改测试套件的模型行为.假设您定义了一些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
Run Code Online (Sandbox Code Playgroud)