rails:如何访问应用程序控制器中的方法?

jmc*_*tie 9 ruby-on-rails

我想,Noob范围问题.:\

class ApplicationController < ActionController::Base
  protect_from_forgery

  @locations = get_locations

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

end
Run Code Online (Sandbox Code Playgroud)

错误:

undefined local variable or method `get_locations' for ApplicationController:Class
Run Code Online (Sandbox Code Playgroud)

两个问题:1)错误是什么?我是否错误地调用了该方法?2)如何从子类控制器访问此方法?

Lee*_*vis 9

您在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
Run Code Online (Sandbox Code Playgroud)

locations.html.erb

<% @locations.each do |location| %>
  <%= # do something with 'location' %>
<% end %>
Run Code Online (Sandbox Code Playgroud)

如果你想在你的内部使用它,application.html.erb你可以简化一些..

ApplicationController的

class ApplicationController < ActionController::Base
  protect_from_forgery

  def locations
    Location.where(:active => true).order('name').all
  end
 end
Run Code Online (Sandbox Code Playgroud)

application.html.erb

<% locations.each do |location| %>
  <%= # do something with location %>
<% end %>
Run Code Online (Sandbox Code Playgroud)

答案归结为逻辑,并且要真正弄清楚您正在寻找什么,可能需要更多细节.