从布局视图调用帮助程序方法时"undefined method"的 Rails



我在应用程序控制器中有一个助手方法来获取当前购物车:

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>

错误。。

有什么想法吗?

helper_method :current_cart添加到应用程序控制器中。

class ApplicationController < ActionController::Base
  protect_from_forgery
  helper_method :current_cart
  ...
end

您的示例失败,因为您在ApplicationController中定义了方法current_cart,但控制器方法在视图中不可访问。

有两种方法可以实现您想要的:

第一种方法是在辅助对象中移动方法current_cart

第二种方法是用before_filter设置变量@current_cart,并在视图中使用@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 %>

Helper方法属于Helper模块,例如在app/helpers/application_helper.rb

我实际上不确定为什么这在其他视图中有效,但我认为,作为一个站点范围的逻辑,您应该将其定义为ApplicationController的before_filter。如果你只需要把它放在一个控制器里,就放在那里。

而且它不是"帮手"。帮助程序存储在app/helpers中,通常用于通过在其方法中隐藏一些html来简化视图。

相关内容

  • 没有找到相关文章

最新更新