在ruby中有更好的方法吗?

时间:2011-01-17 22:01:55

标签: ruby-on-rails ruby ruby-on-rails-3

实际上这目前根本不起作用

 @category = Category.find(params[:id])
 @sub_categories = @category.sub_categories
 if @sub_categories
  @designs = []
  @sub_categories.each do |sub_cat|
    @designs << sub_cat.designs.paginate :page => params[:page], :order => 'name', :per_page => @per_page
  end
end

它在语法错误

上失败了
categories_controller.rb:21: syntax error, unexpected tSYMBEG, expecting kEND
...<< sub_cat.designs.paginate :page => params[:page], :order ...

基本上我有类别有很多sub_categories有很多设计和它在当前类别,我想显示该类别的所有设计...任何关于最佳实践的想法以及如何解决这个问题

4 个答案:

答案 0 :(得分:2)

假设您打算使用@designs而不是@patterns

@category = Category.find(params[:id])
@sub_categories = @category.sub_categories
pagination_options = { :page => params[:page],
                       :order => 'name',
                       :per_page => @per_page
                     }
unless @sub_categories.empty?
  @designs = []
  @sub_categories.each do |sub_cat|
    @designs << sub_cat.designs.paginate(pagination_options)
  end
end

我认为缺少的是paginate电话参数的括号。

答案 1 :(得分:2)

我会做两件事来重构这个......

首先是通过将分页选项移动到设计模型上的类方法来减少耦合。您的控制器不应该对设计模型了解太多。

class Design < ActiveRecord::Base
  def self.paginate_with_params(params, per_page)
    paginate(:page => params[:page], :order => 'name', :per_page => per_page)
  end
end

其次是从控制器中删除不必要的变量和逻辑,这些变量和逻辑并没有真正增加太多价值:

@category = Category.find(params[:id])
@designs = @category.sub_categories.map |sub_cat|
  sub_cat.designs.paginate_with_params(params, @per_page)
end

我还没有测试过这段代码,所以如果它不起作用,请放轻松我。)

答案 2 :(得分:1)

a = []
b.each do |c|
    a << c.d(e)
end

等于:

a = b.map { |c| c.d(e) }

如果d不需要参数:

a = b.map &:d

但是在你的情况下,我想,你只需要在参数哈希周围添加(),就像Ryan Bigg已经回答的那样。

答案 3 :(得分:1)

@category = Category.find(params[:id])
@sub_categories = @category.sub_categories # assumption: this doesn't return nil
page_opts = {:page => params[:page], :order => 'name', :per_page => @per_page}
@designs = @sub_categories.map {|sub_cat| sub_cat.designs.paginate(page_opts) }