Ошибка Rails «NoMethodError» - только что начал использовать Rails - PullRequest
0 голосов
/ 15 февраля 2011

Надеюсь, это очень легко решить, так как я только начинаю с Rails.

У меня есть одна база данных (Продукты), которая содержит ряд атрибутов продукта, включая бренд, цвет и тип продукта.

В настоящее время у меня есть страница индекса (в каталоге 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". Третья кнопка будет соответствовать результатам, не фильтруемым вообще (т. Е. При начальной загрузке страницы индекса).

В предыдущем вопросе мне посоветовали добавить следующий код: В productfinder_controller:

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? }

In 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 Ошибка связана с <% @ diverbrands.each do | diverbrand | %>

Интересно, была ли проблема в функциях, определяющих @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 не определен в пределах индекса def? Если так, как это можно сделать?

Большое спасибо за ваше время

Ответы [ 2 ]

1 голос
/ 15 февраля 2011

Используя before_filter, вы создаете экземпляр @products, но ваш индекс по-прежнему загружает @ differentbrands.

То, что я думаю, вы должны сделать:

  1. Придерживайтесь одной переменной экземпляра для загрузки продукты.
  2. Добавьте всю логику для добавив продукты к этой переменной в before_filter и в вашей модели. Используйте области, чтобы сделать запросы цепными (используя Rails 3?)
  3. Используйте условие в методе 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 %>

Я могу быть смущен, но я вижу здесь несколько разных вещей. Я вижу марку, цвет и тип. Какой вид по умолчанию вы хотите показать? Если они отфильтрованы по типу, когда цвет вступает в игру?

0 голосов
/ 15 февраля 2011

Спасибо за вашу помощь - я снова просмотрел ваши предложения и сумел выявить, что у меня произошла небольшая ошибка в product.rb, теперь он читает:

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

Кажется, все работает хорошо! Еще раз спасибо

...