Помощники в контроллере - Rails 3 - PullRequest
0 голосов
/ 18 января 2012

Я мигрировал с рельсов 2.x в 3.x.Теперь при вызове метода контроллера выдает

undefined method `my_helper_method' for nil:NilClass

MyController.rb

class MyController < ApplicationController
    def foo
      @template.my_helper_method
    end
end

MyControllerHelper.rb

class MyControllerHelper
    def my_helper_method
      puts "Hello"
    end
end

ApplicationController

class ApplicationController < ActionController::Base
   helper :all
end

Как заставить это работать?

Ответы [ 2 ]

2 голосов
/ 23 марта 2012

На самом деле это ответ в другом сообщении SO: Rails 3: переменная @template внутри контроллеров равна nil

По сути, вы можете заменить @template на view_context

1 голос
/ 18 января 2012

@template - это объект, в вашем случае nil.Если у этого объекта нет метода (my_helper_method), его нельзя вызвать (особенно если он не равен nil).

Методы, определенные в помощниках, вызываются как обычные методы.Но не в контроллерах, они называются в представлениях.Ваш helper :all просто делает все помощники доступными для просмотра.

Итак, по вашему мнению: my_helper_method :arg1, :arg2

Если вам нужен метод для вашего объекта (@template), вам нужно дать этому объекту этот метод.

Пример:

class Template < ActiveRecord::Base

  def my_helper_method
    # do something on a template instance
  end

end


class MyController < ApplicationController
  def foo
    @template = Template.first
    @template.my_helper_method # which actually isn't a helper
  end
end

Что делают помощники:

module MyHelper
  def helper_method_for_template(what)
  end
end

# in your view
helper_method_for_template(@template)

Смешивание в помощнике (помните о беспорядке)в вашем коде при смешивании помощников вида с видами и моделями)

class Template < ActiveRecord::Base
  include MyHelper

  # Now, there is @template.helper_method_for_template(what) in here. 
  # This can get messy when you are making your helpers available to your
  # views AND use them here. So why not just write the code in here where it belongs
  # and leave helpers to the views? 
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...