2013-01-22 4 views
6

In einer Teildatei meiner Anwendung kommt Ich habe den folgenden Code-Schnipsel für die Anzeige von Benutzernavigation (durch Devise): -Was ist `stringify_keys' in Schienen und wie es zu lösen, wenn dieser Fehler

<ul class="nav pull-right"> 
    <% if user_signed_in? %> 
     <li> 
     <%= current_user.email do %> 
     <i class=" icon-user icon-black"></i> 
     <% end %> 
     </li> 
    <li> 
     <%= link_to "Your Links", profiles_index_path do %> 
     <i class=" icon-user icon-black"></i> 
     <% end %> 
    </li> 
    <li> 
     <%= link_to "Sign out", destroy_user_session_path, :method => 'delete' do %> 
     <i class=" icon-user icon-black"></i> 
     <% end %> 
    </li> 

    <% else %> 
    <li> 
     <%= link_to "Login", new_user_session_path do %> 
     <i class=" icon-lock"></i> 
     <% end %> 
    </li> 
    <li> 
     <%= link_to "Sign up", new_user_registration_path do %> 
     <i class=" icon-home"></i> 
     <% end %> 
    </li> 
    <% end %> 
</ul> 

Aber ich erhalte eine Fehlermeldung, dass: -

undefined method `stringify_keys' for "https://stackoverflow.com/users/sign_in":String 

Nun meine Fragen sind: -

  1. Was ist `stringify_keys' im Allgemeinen ??
  2. Wie löse ich das in meinem Code ???

Dank ...

Antwort

23

1) stringify_keys ist eine Methode, die auf einen Hash aufgerufen wird, um seine Schlüssel von Symbolen in Zeichenfolgen zu konvertieren. Es wurde von Rails hinzugefügt - es ist keine Standard-Ruby-Methode. Here it is in the docs.

{:a => 1, :b => 2}.stringify_keys # => {"a" => 1, "b" => 2} 

2) Dies bedeutet, dass der Code "https://stackoverflow.com/users/sign_in" irgendwo ist vorbei, die einen Hash erwartet. Bei näherer Betrachtung zeigt, dass Sie Mischen und Anpassen von zwei Formen von link_to:

# specify link contents as an argument 
link_to "The text in the link", "/path/to/link", some: "options" 

# specify link contents in a block 
link_to "/path/to/link", some: "options" do 
    "The text in the link" 
end 

Wie Sie sehen können Sie versuchen, beides zu tun:

<%= link_to "Sign out", destroy_user_session_path, :method => 'delete' do %> 
    <i class=" icon-user icon-black"></i> 
<% end %> 

und Rails erwartet das zweite Argument in der Blockform zu Sei der Optionen-Hash, also ruft er stringify_keys darauf auf, was deinen Fehler verursacht.

ändern diese Links wie diese stattdessen aussehen:

<%= link_to destroy_user_session_path, :method => 'delete' do %> 
    <i class=" icon-user icon-black"></i> Sign out 
<% end %> 
+0

nette Erklärung :) – sameera207

+0

Es löste mein Problem ... Danke @Andy – Siddharth

+0

Arbeit ist großartig danke – santosh

0

gemäß dem DOKUMENTAT stringify_keys versuchen, alle Schlüssel in eine Zeichenfolge zu konvertieren. Also in einfachen Arbeiten erwartet die Methode etwas mit Schlüssel Werte und konvertiert seine Schlüssel zu Strings.

In Ihrem Fall könnte Ihr Benutzerobjekt höchstwahrscheinlich leer oder ein Plan-String sein. Ist dies nicht Arbeit versuchen, die vollständige Fehlerprotokoll

+0

Lassen Sie mich erwähnen Sie etwas, das dieser Fehler passiert, wenn ich hinzufüge, „do“ und „Ende“ Zustand zu meinem „link_to“ Helfer. Das ist, wenn mein link_to Block einfach wie folgt aussieht: -

  • <% = link_to "Abmelden", destroy_user_session_path,: method => 'löschen' %>
  • Siddharth

    +0

    können Sie den Link_to Helfer mit Ihrem 'Do' 'Ende' Tags schreiben – sameera207

    +0

    Ok Ich habe es gelöst von @Andy Antwort ... Danke für Ihre Hilfe ... – Siddharth