Kyl*_*tan 1 ruby ruby-on-rails
我有两个小的结构问题,我不确定如何处理,因为我与RoR的相对新手.
第一个问题:在我的一个观点中,我的代码如下所示:
<ul style="list-style-type: circle">
<li><%= @apples.size %> apples</li>
<li><%= @oranges.size %> oranges</li>
<li><%= @bananas.size %> bananas</li>
<li><%= @grapefruits.size %> grapefruits</li>
</ul>
Run Code Online (Sandbox Code Playgroud)
是否有可能重构这一点,以便我只需要在一些不同种类的水果列表上迭代一次,并<li>自动生成相应的水果?编辑:我忘了补充一点@apples,@oranges等等,可能是nil.是否有一种惯用的方法来处理它?
第二个问题:在我的控制器中,我的代码如下所示:
@apples = Apple.find(:all)
@apples.each { |apple| apple.do_stuff(:xyz) }
@bananas = Banana.find(:all)
@bananas.each = { |banana| banana.do_stuff(:xyz) }
# ... &c
Run Code Online (Sandbox Code Playgroud)
如您所见,以完全相同的方式多次调用相同的操作.有没有办法将此缩短为类似的东西[Apple.find(:all), ...].each { |fruit| ... },而是让它起作用?
非常感谢您的帮助!
我会帮帮忙
def fruit_size(fruit)
list = @fruits[fruit]
return if list.empty?
content_tag(:li, "#{list.size} #{fruit}")
end
Run Code Online (Sandbox Code Playgroud)
这在视图中:
<% ["apples", "oranges", "bananas", .....].each do |fruit| %>
<%= fruit_size(fruit)
<% end %>
Run Code Online (Sandbox Code Playgroud)
在你的控制器中:
@fruits = {}
["apples", "oranges", "bananas", ......].each do |fruit|
@fruits[fruit] = fruit.classify.constantize.find(:all).each {|record|
record.whatever_here
end
end
Run Code Online (Sandbox Code Playgroud)
将所有项目存储在哈希中是有意义的@fruits,这样您就不必使用instance_variable_get和填充.
也许您还想在某处定义该数组,这样您就不必在控制器和视图中重复它.让我们假装你有一个水果模型.
class Fruit < ActiveRecord::Base
FRUITS = ["apples", "oranges", "bananas", ....]
end
Run Code Online (Sandbox Code Playgroud)
然后,在视图和控制器中使用Fruit :: FRUITS.