Rails渲染模板或部分但执行控制器

时间:2013-12-27 07:33:52

标签: ruby-on-rails templates views partials

我正在尝试将信息显示在对话框中。我希望从视图(模板)加载此类信息。问题是,当我使用

<%= 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有不同的错误。

如何在执行控制器的情况下从另一个加载部分或视图?

编辑:

为了给你一个大的图片,我要做的是向用户显示(当他将鼠标移到链接上时)一个对话框,预览他将点击该链接时会看到什么。

1 个答案:

答案 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