What is `stringify_keys' in rails and how to solve it when this error comes

|▌冷眼眸甩不掉的悲伤 提交于 2019-12-21 11:20:10

问题


In a partial file of my application I have the following code snippet for displaying user navigation(through Devise):-

<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>

But I'm getting an error saying:-

undefined method `stringify_keys' for "/users/sign_in":String

Now my questions are:-

  1. What is `stringify_keys' in general??
  2. How do I resolve this in my code???

Thanks...


回答1:


1) stringify_keys is a method that is called on a hash to convert its keys from symbols to strings. It's added by Rails - it's not a standard Ruby method. Here it is in the docs.

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

2) This means that your code is passing "/users/sign_in" somewhere that is expecting a hash. Closer inspection reveals that you are mixing and matching two forms of 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

As you can see you are trying to do both:

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

and Rails expects the second argument in the block form to be the options hash, so it is calling stringify_keys on it which is causing your error.

Change those links to look like this instead:

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



回答2:


as per the documentat stringify_keys will try to convert all keys to a string. So in simple works the method expects something with key values and convert its keys to strings.

In your case most probably your User object could be empty or a plan string. is this doesnot work try posting the complete error log



来源:https://stackoverflow.com/questions/14456411/what-is-stringify-keys-in-rails-and-how-to-solve-it-when-this-error-comes

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!