【问题标题】:Undefined method 'slice'未定义的方法“切片”
【发布时间】:2026-01-06 13:40:01
【问题描述】:

在我的 Rails 4.2.0 应用程序中,我在视图模板中有以下代码:

<% if flash[:tutorial].present? %>
  <% flash.slice(:tutorial) %>
<% end %>

<% flash.each do |name, msg| %>
  <div class="flash <%= name %>">
    <p> 
      <%= msg %>
    </p>
  </div>
<% end %>

然而它会抛出一个错误:

Undefined method 'slice' for #<ActionDispatch::Flash::FlashHash:0x0818>

有没有人知道我可能缺少什么或如何让它发挥作用?

【问题讨论】:

  • 你想做什么?我不知道你为什么要这样使用slice
  • 如果我有像{ :tutorial =&gt; "Message", :notice =&gt; "Message", :success =&gt; "Message" } 这样的闪存,我想删除除:tutorial 键之外的所有键。
  • 但这与slice 有什么关系?为什么不直接渲染flash[:tutorial]?这是我在这里试图从你那里得到的信息,slice 的任何内容都不需要渲染flash[:tutorial] 中的任何值。
  • 也许您可以将闪存值作为哈希分配给变量并修改为:flash_hash = flash.to_hash 然后&lt;%= flash_hash.each { |k,_v| flash_hash.delete(k) if k != 'notice' } %&gt;
  • 好的,既然你知道only键是tutorial,为什么要循环呢?为什么不直接输出&lt;% if flash[:tutorial] %&gt;&lt;div class="flash tutorial"&gt;&lt;p&gt;&lt;%= flash[:tutorial] %&gt;&lt;/p&gt;&lt;/div&gt;&lt;% end %&gt;

标签: ruby-on-rails ruby actiondispatch


【解决方案1】:

flash 不是哈希。它是一个行为(部分)像哈希的对象。上面没有slice 方法。

目前还不清楚您在此处使用slice 想要完成什么(因为您没有输出结果,并且无论如何输出结果都没有意义)但是如果您想要实现@987654324 的目标@ing 一个 Hash 就可以实现,你可以简单地创建一个新的 Hash:

<% { tutorial: flash[:tutorial] } %>

【讨论】:

    最近更新 更多