2011-01-17 3 views
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, который имеет много дизайн и его текущую категорию, и я хочу показать все проекты для этой категории ... любую идею о лучших практиках и о том, как исправлять эту проблему

ответ

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 

Я не проверял этот код, поэтому, пожалуйста, идти легко на меня, если он не работает :)

+0

fix: "<<" как символ наследования –

+0

@ Daniel: что вы имеете в виду, что «<<» является исправлением, можете ли вы объяснить – Trace

+0

@Matt - я исправил его, я имел << вместо < –

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 вызова.

+0

Почему вы считаете, что это было неудачно в первую очередь? Потому что он не знал, какие параметры были «paginate» и какие параметры были '<<'? –

+0

Одна из проблем заключается в том, что теперь цикл в представлении дает мне ошибки, потому что он зацикливает объекты will_paginate, и вот моя ошибка неопределенного метода 'name 'для # Trace

+0

исправлена ​​первая проблема с flatten, но теперь я получаю undefined метод 'total_pages 'для # Извлеченный источник (вокруг строки # 37): 37: <% = will_paginate @designs%> – Trace

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

Равен:

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

И если d не нужны параметры:

a = b.map &:d 

Но в вашем случае, я думаю, вам просто нужно добавить () вокруг вашего параметры хэша, как уже ответил Райан Бигг.

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) } 
+0

Мне нравится краткий ответ, но я получаю эту ошибку теперь неопределенный метод 'total_pages 'для # <Массив: 0x1036be208> Извлеченный источник (вокруг строки # 37): 37: \t <% = will_paginate @designs%> – Trace

+0

Ну,' @ design' является 'Array' элементов' WillPaginate :: Collection'. Это не сама коллекция подкачки. –

Смежные вопросы