Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 铁路";“未定义的方法”;从布局视图调用帮助器方法时_Ruby On Rails_Ruby On Rails 3_Layout - Fatal编程技术网

Ruby on rails 铁路";“未定义的方法”;从布局视图调用帮助器方法时

Ruby on rails 铁路";“未定义的方法”;从布局视图调用帮助器方法时,ruby-on-rails,ruby-on-rails-3,layout,Ruby On Rails,Ruby On Rails 3,Layout,我在中有一个助手方法,可以在我的应用程序控制器中获取当前购物车: 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.fi

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

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
class ApplicationController
我可以从大多数视图调用该方法,但我想在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>
未定义的局部变量或方法“current_cart”#
错误


有什么想法吗?

帮助程序方法属于帮助程序模块,例如在
app/helpers/application\u Helper.rb
中,我实际上不确定为什么这在其他视图中有效,但我认为,作为站点范围的逻辑,您应该将其定义为应用程序控制器的前过滤器。如果您只需要将它放在一个控制器中,请将它放在那里


它不是一个“助手”。助手存储在
app/Helpers
中,通常通过在其方法中隐藏一些html来简化视图。

您的示例失败,因为您在ApplicationController中定义了方法
current\u cart
,但无法在视图中访问控制器方法

有两种方法可以实现您的目标:

第一种方法是在助手中移动方法
current\u cart

第二种方法是在过滤器前设置变量
@current\u cart
,并在视图中使用
@current\u 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
class ApplicationController
在你看来:

<%= link_to "#{@current_cart.number_of_items}", current_cart_url %>

helper\u方法:当前购物车添加到应用程序控制器

class ApplicationController < ActionController::Base
  protect_from_forgery
  helper_method :current_cart
  ...
end
class ApplicationController
问题是如何在application.html.erb视图中访问我的当前购物车对象?您可以将您的
当前购物车
方法放在帮助程序中。但在你的情况下,似乎你最好使用其他人提供的
before_filter
方法。我已经使用了helper:all-这不应该包括所有作为助手的方法吗?@frank blizzard:
helper:all
意味着你将包括来自app/helpers的所有助手的所有方法,这些方法将在视图中可用。但是
helper\u方法
用于将控制器方法声明为helper。好的,感谢澄清-将此更改为适当的答案,因为它仅在必要时执行,取消链接before\u筛选器解决方案。@frank..我相信正确答案如@Tumtu所述:在应用程序控制器中添加
helper\u方法:current\u cart
,以使此方法可供视图访问。此处描述的方法有一个缺点,即您必须在特定控制器中使用
before\u filter
指定所有人使用此方法的位置。否则,将在每次操作之前执行筛选器。