9

在我的应用程序的部分文件中,我有以下用于显示用户导航的代码片段(通过设计):-

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

但我收到一个错误消息:-

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

现在我的问题是:-

  1. 一般而言,什么是`stringify_keys'
  2. 如何在我的代码中解决这个问题???

谢谢...

4

2 回答 2

33

1)stringify_keys是一种在散列上调用以将其键从符号转换为字符串的方法。它是由 Rails 添加的——它不是标准的 Ruby 方法。这是在文档中

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

2)这意味着您的代码正在传递"/users/sign_in"一个期望哈希的地方。仔细检查表明您正在混合和匹配以下两种形式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

如您所见,您正在尝试同时执行以下操作:

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

并且 Rails 期望块形式中的第二个参数是选项哈希,因此它正在调用stringify_keys它,这会导致您的错误。

将这些链接更改为如下所示:

<%= link_to destroy_user_session_path, :method => 'delete' do %>
  <i class=" icon-user icon-black"></i> Sign out 
<% end %>
于 2013-01-22T10:44:23.897 回答
0

根据文档stringify_keys 将尝试将所有键转换为字符串。因此,在简单的工作中,该方法需要具有键值的东西并将其转换为字符串。

在您的情况下,您的 User 对象很可能是空的或计划字符串。这不起作用尝试发布完整的错误日志

于 2013-01-22T10:42:02.570 回答