【问题标题】:Rails render a partial with collection twice?Rails 用集合渲染部分内容两次?
【发布时间】:2023-03-13 21:45:01
【问题描述】:

我有这个:

<%= render :partial => "rewards", :collection => @rewards, :as => :reward %>

当我用&lt;%= @rewards.count %&gt; 计算集合中的项目时,它显示为 1,我检查了数据库是否只有一个奖励。但是,部分在我的主视图中呈现了两次,第二个是空的(奖励 == nil)。这有什么线索吗?

更新: 找到原因了,在这个render语句之前,有一个user.rewards.build创建表单的语句:

<%= render :partial => "form_reward", :locals => {:user => @user, :reward => @user.rewards.build } %>
<%= render :partial => "rewards", :collection => @rewards, :as => :reward, :locals => {:user => @user } %>

不知何故,部分也渲染了这个对象!我猜这是因为名称污染。那么现在如何克服这个问题呢?

【问题讨论】:

    标签: ruby-on-rails


    【解决方案1】:
    <%= render :partial => 'rewards', :object => @rewards, :as => :reward %>
    

    你应该能够以reward 的身份访问它来测试试试这个:

    <%= reward.inspect %>
    

    哦,如果它应该被重复,你应该将它作为 :collection 而不是 :object 像在我的示例中那样传递

    【讨论】:

      【解决方案2】:

      我建议您检查填充了@rewards 的查询。 @reward 集合中似乎有两个对象,一个是 Reward 对象,一个是 nil 对象。

      你可以使用集合的 compact 方法来移除 nil 对象。

      【讨论】:

      • 看起来很奇怪......我担心原因可能是别的......我也试图在我的开发实例中重现这个问题,但我不能......
      • 我已经在我的问题中添加了更多代码,一旦我删除了部分表单,那么就不会有成瘾奖励对象。
      • 为什么不在第一个渲染语句中尝试使用不同的变量作为奖励,例如 :locals => {:new_reward => ...}。这应该有助于我们确认是不是因为名称污染。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-22
      • 1970-01-01
      • 2016-04-24
      • 1970-01-01
      相关资源
      最近更新 更多