【问题标题】:Can't render partial with interpolated instance variable无法使用插值实例变量渲染部分
【发布时间】:2013-04-02 16:23:12
【问题描述】:

我正在尝试在表格列“组”设置为“女性”的产品页面上呈现部分内容。

在 products_controller.rb 我有:

@subnav = Spree::Product.find(params[:group])

然后在 products#show 我有:

<div class="subnav">
 <%= render "spree/shared/#{@subnav}_subnav" %>
</div><!--subnav -->

因此,当产品具有“女性”组时,它应该呈现“spree/shared/women_subnav”。但相反,我收到“ActionView::MissingTemplate in Spree/products#show”错误,说

 "Missing partial spree/shared/_subnav with {:locale=>[:en], :formats=>[:html], :handlers=>[:erb, :builder, :coffee, :rabl], :versions=>[:v1]}.

所以由于某种原因,它甚至没有识别出变量的存在。

我也试过了

 @subnav = params[:group]

 @subnav = Product.find(params[:group]

感谢您的帮助!

【问题讨论】:

标签: ruby-on-rails spree


【解决方案1】:

出现此错误是因为在 &lt;%= render "spree/shared/#{@subnav}_subnav" %&gt; 中,@subnav 为 nil 或空白。 它是空白的,因为 params[:group] 是 nil 或空白。它是空白的,因为 params 没有 :group 键。

您的网址是pants.telegraphbranding.com/products/:id

这意味着 params 有一个键:id

如果你想访问一个组,你必须像这样定义一个路由:

pants.telegraphbranding.com/groups/:group_id/products/:id

或者直接在网址中传组:pants.telegraphbranding.com/products/123?group_id=456

接下来,你可以写

@subnav = Spree::Product.find(params[:group_id])

【讨论】:

    【解决方案2】:

    根据评论,您没有在 url 中将组参数传递给服务器。

     @subnav = Spree::Product.find(params[:group]) 
    

    这里@subnav 将为零,字符串插值将“#{@subnav}”替换为空字符串。

    @subnav 也将是 ActiveRecord 的实例而不是字符串,因此您需要调用所需的属性,该属性将返回字符串(在您的情况下为“women”)。

    在渲染部分以处理 nil 值之前,还要注意检查 @subnav 的值

    喜欢

    <% unless @subnav.nil? %>
    <div class="subnav">
     <%= render "spree/shared/#{@subnav.name}_subnav" %>
    </div><!--subnav -->
    <% end %>
    

    假设 name 是 ActiveRecord 实例的属性来保存“女性”值

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-15
      相关资源
      最近更新 更多