неопределенная ошибка метода, но я определил это! - PullRequest
0 голосов
/ 26 января 2010

Rails новичок здесь, пытаясь заставить работать новый контроллер.

Когда я пытаюсь показать ann существующий экземпляр, я получаю неопределенную ошибку метода вспомогательного метода.Кодекс следует.Любая идея, почему getRecipes будет неопределенным?!

Контроллер:

    def show
       id = params[:id]
       recipe_ids = ConcreteMenu.getRecipes(id)

       respond_to do |format|
          format.html
       end
  end

Модель

require 'json/objects'

class ConcreteMenu < ActiveRecord::Base
  has_many :menu_recipes
  has_many :recipes, :through => :menu_recipes

  belongs_to :menu

  def self.getRecipes(id)
      recipes = MenuRecipe.find(:all, :conditions => {:concrete_menu_id => id}, :select => 'id')
   end
end

Ответы [ 2 ]

2 голосов
/ 26 января 2010

Было бы полезно, если бы вы вставили текст ошибки, потому что ваше объяснение оставляет много возможностей для того, что может быть не так. НО , есть более простой способ получить то, что вы хотите. Значение определения отношений has_many заключается в том, что вместо вызова метода класса и передачи идентификатора конкретного меню для получения связанных с ним рецептов вы можете просто сделать это:

def show
  @concrete_menu = ConcreteMenu.find(params[:id], :include => :recipes)
end

Теперь у вас будет объект меню, а @concrete_menu.recipes возвращает массив необходимых вам рецептов. Эта функция уже встроена, не нужно изобретать велосипед.

Кроме того, я заметил, что вы пытались собирать идентификаторы в контроллере вместо самих объектов. Это говорит о том, что вы возвращаетесь и действительно извлекаете записи в самом представлении. Это менее эффективно и более сложно устранять неполадки, когда что-то идет не так. Мой пример выше будет делать то, что вам нужно, лучше (и более приемлемо для рельсов).

1 голос
/ 26 января 2010

Как вы там определили, он должен быть доступен. Есть ли вероятность, что вы определили что-то еще под названием ConcreteMenu, но в другом контексте?

Чтобы убедиться, что вы звоните правильно, там, где может быть двусмысленность, вы можете обратиться к классу верхнего уровня:

recipe_ids = ::ConcreteMenu.getRecipes(id)

Другой способ проверить правильность определения метода через скрипт / консоль:

ConcreteMenu.methods.grep(/getRecipe/)
# => ["getRecipes"]

Предполагается, конечно, что у вас возникли проблемы с методом getRecipes. Возможно, вы ошибаетесь, когда переменные контроллера передаются в представление:

def show
   @id = params[:id]
   @recipe_ids = ConcreteMenu.getRecipes(@id)

   respond_to do |format|
      format.html
   end
end

Любые переменные экземпляра, определенные (@ ...), будут доступны в контексте представления, но любые локальные переменные больше не будут определяться, поскольку они находятся вне области действия.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...