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
指定所有人使用此方法的位置。否则,将在每次操作之前执行筛选器。