9

アプリケーションの部分ファイルには、(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>

しかし、次のようなエラーが表示されます:-

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

今私の質問は: -

  1. 一般に、 「stringify_keys」とは何ですか??
  2. コードでこれを解決するにはどうすればよいですか???

ありがとう...

4

2 に答える 2

33

1)stringify_keysは、キーをシンボルから文字列に変換するためにハッシュで呼び出されるメソッドです。これは Rails によって追加されたものであり、標準の Ruby メソッドではありません。これは docs にあります。

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

2) これは、コードが"/users/sign_in"ハッシュを予期している場所を通過していることを意味します。よく調べてみると、次の 2 つの形式を混合して一致させていることがわかります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 は、ブロック形式の 2 番目の引数がオプション ハッシュであると想定しているため、それを呼び出し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 に答える