2017-10-10 21 views
-1

我控制器:Ruby on Rails的閃爍

class GroupsController < ApplicationController 
    def index 
    flash[:notice] = "GoodNight" 
    end 
end 

和助手:

module FlashesHelper 
    FLASHES_CLASS ={alert: "danger", notice: "success", warning: "warning"}.freeze  
    def flash_class(key) 
    FLASHES_CLASS.fetch(key.to_sym, key) 
    end 
    def user_facing_flashes 
    flash.to_hash.slice(:notice, :alert, :warning) 
    end 
end 

我很困惑,當我做:

flash.to_hash.slice(:notice, :alert, :warning) 

它不工作,但如果我這樣做:

flash.to_hash.slice("notice", "alert", "warning") 

它的工作原理。

如果我嘗試這樣:

book = Hash.new 
book[:matz] = "Ruby" 
book.to_hash.slice(:matz) # => {:matz => "Ruby"} 
book.to_hash.slice("matz") # => {} 

請告訴我爲什麼。

+1

你應該多關注一下你的寫作:你不清楚你在問什麼,你的例子看起來可能會更短(你不需要控制器/幫手代碼恕我直言) –

+1

@UlysseBN:no ,我發現控制器/幫手代碼在這裏是必要的,以證明這個問題。這不是一個關於散列的問題,這是關於flash行爲的一個問題。好吧,也許不是[全部]幫手:) –

+0

所以不必要的部分將是最後一個散列 –

回答

2

你似乎認爲flash是一個散列。不是。這是一個FlashHash。它的[]=方法將鍵轉換爲字符串。

http://api.rubyonrails.org/v5.1.4/classes/ActionDispatch/Flash/FlashHash.html#method-i-5B-5D-3D

# File actionpack/lib/action_dispatch/middleware/flash.rb, line 153 
def []=(k, v) 
    k = k.to_s 
    @discard.delete k 
    @flashes[k] = v 
end 

那是你:notice如何成爲'notice'(之前它存儲在任何地方)。

+0

由於'to_hash'適用,我不認爲'FlashHash'或任何相關的。這只是一個散列。 – sawa

+0

@sawa:相反,它是一個'FlashHash'是超級相關的。這是什麼轉換。 –

+0

哦,我明白了!非常感謝你@SergioTulentsev :) –