我正在尝试将信息显示在对话框中。我希望从视图(模板)加载此类信息。问题是,当我使用
时<%= render template:'panels/product_specifications' %>
它试图加载信息,但是,因为我在控制器中定义了我的视图中使用的全局变量,并且控制器没有被执行,所以它引发了我:
undefined method `banner_image_with_arrows_filename' for nil:NilClass
Extracted source (around line #2):
1:
2: - banner_image = "banners/panels/#{@panel.banner_image_with_arrows_filename}"
3: #image-info
4: %table
5: %tr
@panel变量在控制器中定义:
def load_panel
@panel = Panel.find_or_build_from_id(params[:id])
if !@panel.available_in_market?(market)
add_flash_notice(t("pages.panel.text.not_available_in_market", :market => market.name), true)
end
end
在before_filter
。
我还尝试使用render partial:'panels/products_specifications
(首先强调'product_specifications.html.erb'),render action:'panels/product_specifications', controller:'product_specifications
有不同的错误。
如何在执行控制器的情况下从另一个加载部分或视图?
编辑:
为了给你一个大的图片,我要做的是向用户显示(当他将鼠标移到链接上时)一个对话框,预览他将点击该链接时会看到什么。
答案 0 :(得分:2)
如果我也理解,你点击了一个用before_filter执行方法load_panel
的动作,并且相关的视图,你试图用变量渲染模板。
您应该尝试的第一件事是查看Panel.find_or_build_from_id(params[:id])
是否返回了记录。您可以使用puts
方法或使用pry之类的调试器。
您也可以尝试执行此操作<%= render template:'panels/product_specifications', panel: @panel %>
并在模板中使用panel
作为本地变量,如下所示:banners/panels/#{panel.banner_image_with_arrows_filename}
。
我认为最佳做法可以是使用presenter。
聊天后的最终答案
您必须使用ajax显示新面板并点击控制器操作。您可以看到示例here。