Rails报错:ActionView::Base未定义view_context变量或方法
问题解决方法
错误原因
你遇到的undefined local variable or method 'view_context'错误,是因为在FeaturesHelper顶层直接定义feature_info时,代码会在Helper类加载阶段执行,此时还未关联到具体的视图上下文(ActionView::Base实例),view_context对象还不存在,自然无法调用它的link_to方法。
解决方案
方案1:将feature_info改为Helper方法
把静态的feature_info变量改成Helper方法,这样方法会在视图渲染时被调用,此时已经处于视图上下文环境中,可直接使用link_to(无需view_context前缀):
修改FeaturesHelper:
module FeaturesHelper def feature_info [ { features: [ { description: "This is a #{link_to \"link!\", \"https://www.example.com\", target: :_blank, class: \"pink-link\"}" } ] }, # 其他功能数据... ] end end
局部视图无需修改,因为feature_info现在是一个可调用的方法,执行时会自动获取视图上下文:
<% feature_info.each do |info| %> <% info[:features].each do |feature| %> <%= feature[:description].html_safe %> <% end %> <% end %>
方案2:拆分数据与视图渲染逻辑
将链接相关的参数从描述文本中分离,在局部视图里动态生成链接,避免在Helper中提前构建HTML:
修改FeaturesHelper的feature_info:
module FeaturesHelper feature_info = [ { features: [ { prefix_text: "This is a ", link_text: "link!", link_url: "https://www.example.com", link_options: { target: :_blank, class: "pink-link" } } ] }, # 其他功能数据... ] end
更新局部视图,在视图中调用link_to生成链接:
<% feature_info.each do |info| %> <% info[:features].each do |feature| %> <%= feature[:prefix_text] %> <%= link_to feature[:link_text], feature[:link_url], feature[:link_options] %> <% end %> <% end %>
这种方式更符合MVC的职责分离,数据只存储纯文本和配置,视图负责HTML渲染。
内容的提问来源于stack exchange,提问作者Sara Fuerst
相关产品推荐
相关产品推荐

