2011-01-17 8 views
3

でこれを行うにはそこに良い方法は実際に基本的に私は、カテゴリが多くを持っている多くのsub_categoriesを持って、この構文エラーはルビー

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

に失敗し、すべての

@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 

その時にこの現在doesntの仕事を持っていますデザインとそれを現在のカテゴリに表示し、そのカテゴリのすべてのデザインを表示したいと思います。ベストプラクティスに関する考え方とこの問題の解決方法

答えて

2

私はこれをリファクタリングするための2つのことをするだろう...

まず設計モデル上のクラスのメソッドにページ付けのオプションを移動することによって、結合を低減することです。あなたのコントローラーは、この設計モデルについてこれほど多く知ってはいけません。もしそうなら私に簡単にアクセスしてください、私はこのコードをテストしていない

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

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

この問題の1つの問題は、現在のビューのループでは、will_paginateオブジェクトをループしてエラーが発生することです。# Trace

+0

のエラーは定義されていません。私は未定義のメソッドを取得しています。#抽出されたソース(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 

をしかし、あなたの場合には、私は推測し、あなたは自分の周りに()を追加する必要があります既に答えられているように、パラメータハッシュ、Ryan Bigg。

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

私は簡潔な答えが大好きですが、このエラーは現在定義されていません。#のソースコード(37行目):37:\t <%= will_paginate @designs%> – Trace

+0

' designsは 'WillPaginate :: Collection'要素の' Array'です。それ自体はページ区切りではありません。 –