0

Railsを使い始めたばかりなので、これが非常に簡単に解決できることを願っています。

ブランド、色、product_type など、多数の製品属性を含む 1 つのデータベース (製品) があります。

現在、データベース内の製品の概要を提供できるインデックス ページ (productfinder ディレクトリ内) があります。index.html.erb で次のコードを使用しています。

<% @distinctbrands.each do |distinctbrand| %>
  <h4><%= distinctbrand %></h4>
<% end %>

productfinder_controller.rb 内には次のものがあります。

 def index
    @distinctbrands = Product.find( :all, :order => 'brand ASC', :select => 'brand' ).map{ |i| i.brand }.uniq
    @distinctcolours = Product.find( :all, :order => 'colour ASC', :select => 'colour' ).map{ |i| i.colour }.uniq
  end

この時点までは、すべてが正しく機能しているようです

ここで、インデックス ページに 3 つのボタンを追加したいと思います。これらのボタンを使用すると、ユーザーは、product_type = "new" または "used" のいずれかに一致する、製品のサブセットの個別のブランドと個別の色を再計算できます。3 番目のボタンは、まったくフィルタリングされていない結果に対応します (つまり、インデックス ページが最初に読み込まれるため)。

以前の質問で、次のコードを追加するようにアドバイスされました。

before_filter :load_products, :only => [:index, :bybrand, :bycolour, :byprice]
protected

 def load_products
    @products = Product.by_product_type(params[:product_type])
  end

Product.rb で:

scope :by_product_type, lambda{  |product_type| where(product_type: product_type.to_i) unless product_type.nil? }

index.html.erb で

<%= link_to "New", :controller => params[:controller], :action => params[:action], :product_type => 'New' %>
<%= link_to "Used", :controller => params[:controller], :action => params[:action], :product_type => 'Used' %>
<%= link_to "Don't Restrict", :controller => params[:controller], :action => params[:action], :product_type => '' %>

アプリケーションが実行されると、NoMethodError - ProductFinder#Index が発生します (nil.each を実行しようとしているときに、エラーは <% @distinctbrands.each do |distinctbrand| %> に関連付けられています)。

データベースがフィルタリングされたため、@distinctbrands と @distinctcolours を定義する関数に問題があるのではないかと考えましたが、次の両方の状況で同じエラーが発生します。

def index
  @distinctbrands = @product.find( :all, :order => 'brand ASC', :select => 'brand' ).map{ |i| i.brand }.uniq
  @distinctcolours = @product.find( :all, :order => 'colour ASC', :select => 'colour' ).map{ |i| i.colour }.uniq
end

def index
  @distinctbrands = Product.find( :all, :order => 'brand ASC', :select => 'brand' ).map{ |i| i.brand }.uniq
  @distinctcolours = Product.find( :all, :order => 'colour ASC', :select => 'colour' ).map{ |i| i.colour }.uniq
end

誰かが私に可能な解決策を提供できますか? @products が定義インデックス内で定義されていないことに問題がありますか? もしそうなら、どうすればこれを行うことができますか?

お時間をいただきありがとうございました

4

2 に答える 2

1

before_filter を使用して @products のインスタンスを作成していますが、インデックスはまだ @distinctbrands をロードしています。

あなたがすべきだと思うことは次のとおりです。

  1. 製品をロードするために 1 つのインスタンス変数に固執します。
  2. 製品を追加するためのすべてのロジックを before_filter とモデルのその変数に追加します。スコープを使用してクエリを連鎖可能にします (Rails 3 を使用していますか?)
  3. params ハッシュを検索する load_products メソッドで条件を使用して、params で設定されたオプションによって製品をロードする必要があるか、またはすべてだけをロードするかを決定します。

したがって、モデルでは、load_products メソッドは次のようになります。

def load_products
  if params[:product_type]
    @products = Product.by_product_type(params[:product_type])
  else
    @products = Product.find( :all, :order => 'brand ASC', :select => 'brand' ).map{ |i| i.brand }.uniq
  end
end

次に、インデックスを次のように更新します。

<% @products.each do |product| %>
  <h4><%= product.name %></h4>
<% end %>

混乱するかもしれませんが、ここにはいくつかの異なるものがあります。ブランド、色、タイプが表示されます。表示するデフォルトのビューは何ですか? 種類ごとにフィルターをかけた場合、色はいつ登場しますか?

于 2011-02-15T01:35:15.323 に答える
0

ご協力いただきありがとうございます。ご提案をもう一度確認したところ、product.rb に軽微なエラーがあったことがわかりました。現在は次のようになっています。

scope :by_product_type, lambda{|product_type| where(:product_type => product_type) unless product_type.nil? }

すべてうまくいっているようです!再度、感謝します

于 2011-02-15T10:34:44.410 に答える