рельсы: как я могу получить доступ к методу в моем контроллере приложения? - PullRequest
9 голосов
/ 07 декабря 2010

Проблема с нубом, я думаю. : \

class ApplicationController < ActionController::Base
  protect_from_forgery

  @locations = get_locations

  def get_locations
    Location.where(:active => true).order('name').all
  end

end

Ошибка:

undefined local variable or method `get_locations' for ApplicationController:Class

Два вопроса: 1) Что за ошибка? Я неправильно вызываю метод? 2) Как я могу получить доступ к этому методу с субклассического контроллера?

Ответы [ 4 ]

9 голосов
/ 08 декабря 2010

Вы вызываете get_locations в области видимости класса, но метод является методом экземпляра, а не методом класса.Если, например, вы использовали def self.get_locations, то вы предоставляете метод класса, один из которых вы можете использовать в пределах области действия класса (после того, как вы его определили, а не до того, как вы это делаете).

проблема здесь в логике, для чего этот метод?Для чего вы собираетесь использовать @locations?Если это входит в представление вашего приложения, то вы должны поместить этот метод в модуль ApplicationHelper и вызвать его из соответствующего действия.Если вы хотите использовать его в другом представлении на другом контроллере и хотите использовать @locations в своем методе locations, возможно, ваша установка может выглядеть примерно так:

PagesController

class PagesController < ActionController::Base
  def locations
    @locations = Location.where(:active => true).order('name').all
  end
end

location.html.erb

<% @locations.each do |location| %>
  <%= # do something with 'location' %>
<% end %>

Если вы хотите использовать это внутри вашего application.html.erb, вы можете немного упростить его..

ApplicationController

class ApplicationController < ActionController::Base
  protect_from_forgery

  def locations
    Location.where(:active => true).order('name').all
  end
 end

application.html.erb

<% locations.each do |location| %>
  <%= # do something with location %>
<% end %>

Ответ сводится к логикеи чтобы действительно понять, что именно вы ищете, вероятно, потребуется больше деталей.

3 голосов
/ 07 декабря 2010

Вы вызываете это из области видимости класса, а не из области видимости экземпляра.более вероятно, что вам нужно следующее:

class ApplicationController < ActionController::Base
  protect_from_forgery
  before_filter :setup_locations


  private
  def setup_locations
    @locations = Location.where(:active => true).order('name').all
  end

end

Чтобы ваш исходный пример работал, вам нужно настроить #get_locations на self (который указывает на класс в определении), например, так:

class ApplicationController < ActionController::Base
  protect_from_forgery

  @locations = get_locations

  def self.get_locations
    Location.where(:active => true).order('name').all
  end

end

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

1 голос
/ 13 апреля 2016

Даже если вопрос довольно старый, вы также можете вызвать действие вашего контроллера в любом месте, просто набрав:

ApplicationController.new.get_locations
1 голос
/ 07 декабря 2010

Я представляю, что эта строка:

@locations = get_locations

... пытается получить доступ к методу уровня класса get_locations, а не к методу экземпляра.

Подсказка заключается в том, что сообщение об ошибке показывает, что он не может найти его в классе (самом ApplicationController: Class), а не в экземпляре этого класса. Это означает, что вы находитесь в области видимости класса, а не области видимости.

Это исправит это:

  def self.get_locations
     Location.where(:active => true).order('name').all
  end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...