rails "undefined method" при вызове вспомогательного метода из макета - PullRequest
5 голосов
/ 13 июня 2011

У меня есть вспомогательный метод для получения текущей корзины покупок в моем контроллере приложения:

class ApplicationController < ActionController::Base
  protect_from_forgery

  helper :all # include all helpers, all the time

  private

  def current_cart
    if session[:cart_id]
      @current_cart ||= Cart.find(session[:cart_id])
      session[:cart_id] = nil if @current_cart.purchased_at
    end
    if session[:cart_id].nil?
      @current_cart = Cart.create!
      session[:cart_id] = @current_cart.id
    end
    @current_cart
  end

end

Я могу вызвать метод из большинства моих представлений, но я хочу использовать его в файле views / layout / application.html.erb, как это:

<div id="cart_menu">
    <ul>
    <li>
      <%= image_tag("cart.jpg")%>
    </li>
    <li>
      <%= link_to "#{current_cart.number_of_items}", current_cart_url %>
    </li>
    <li>
          <a href="/checkout/">Checkout</a>
        </li>
    </ul>
</div>

Но когда я пытаюсь это сделать, я получаю

undefined local variable or method `current_cart' for #<#<Class:0x2d2d834>:0x2d2b908>

ошибка ..

Есть идеи, почему это так?

Ответы [ 4 ]

8 голосов
/ 13 июня 2011

Ваш пример не выполнен, поскольку вы определяете метод current_cart в ApplicationController, но метод контроллера недоступен в представлении.

Есть два способа достичь желаемого:

Первый способ - переместить метод current_cart в помощник.

Вторым способом будет установка переменной @current_cart с помощью before_filter и использование @current_cart в представлении, см. Ниже:

class ApplicationController < ActionController::Base
  protect_from_forgery

  helper :all # include all helpers, all the time

  before_filter :set_current_cart

  private

  def set_current_cart
    if session[:cart_id]
      @current_cart ||= Cart.find(session[:cart_id])
      session[:cart_id] = nil if @current_cart.purchased_at
    end
    if session[:cart_id].nil?
      @current_cart = Cart.create!
      session[:cart_id] = @current_cart.id
    end
  end

end

На ваш взгляд:

<%= link_to "#{@current_cart.number_of_items}", current_cart_url %>
7 голосов
/ 13 июня 2011

Добавьте helper_method :current_cart к вашему контроллеру приложения.

class ApplicationController < ActionController::Base
  protect_from_forgery
  helper_method :current_cart
  ...
end
0 голосов
/ 13 июня 2011

Я на самом деле не уверен, почему это работает в других представлениях, но я думаю, что как логика для всего сайта, вы должны определить это как before_filter для ApplicationController.Если вам нужен только один контроллер, поместите его туда.

И это не «помощники».Помощники хранятся в app/helpers и обычно используются для упрощения представлений, скрывая некоторые html внутри своих методов.

0 голосов
/ 13 июня 2011

Вспомогательные методы относятся к вспомогательным модулям, например, в app/helpers/application_helper.rb

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