1

モデルでタイヤを使用して弾性検索機能を実装しているときに、index.html.erb で nil:NilClass の未定義のメソッド「each」を取得しています。これについて考えられる理由と解決策は何ですか?

index.html.erb:

    <div class="page-header">
  <h1>Friends</h1>

<%= form_tag user_friendships_path, method: :get do %>
      <p>
            <%= text_field_tag :query, params[:query] %>
            <%= submit_tag "Search", name: nil %>
      </p>
<% end %>


</div>

<div>
      <strong>Friend list:</strong>
      <%= link_to 'All', user_friendships_path %> |
      <%= link_to 'Blocked', user_friendships_path(list: 'Blocked') %> |
      <%= link_to 'Requested', user_friendships_path(list: 'Requested') %> |
      <%= link_to 'Accepted', user_friendships_path(list: 'Accepted') %> |
      <%= link_to 'Pending', user_friendships_path(list: 'Pending') %>
</div>
<% @user_friendships.each do |friendship| %>
<% friend = friendship.friend %>
<div id="<%= dom_id(friendship) %>" class="friend row">
      <div class="span1">
            <%= link_to image_tag(friend.gravatar_url), profile_path(friend) %>
      </div>
      <div class="span7">
            <strong><%= friend.full_name %></strong><br />
            <% if friendship.pending? %>
            <em>Friendship is pending.</em> <%= link_to "Delete request", edit_user_friendship_path(id: friend.user_name) %>.
            <% end %>
            <% if friendship.requested? %>
            <em>Friendship requested.</em> <%= link_to "Accept Friendship", edit_user_friendship_path(id: friend.user_name) %>.
            <% end %>
            <% if friendship.accepted? %>
            <em>Friendship started <%= friendship.updated_at %>.</em> <%= link_to "Update friendship", edit_user_friendship_path(id: friend.user_name) %>.
            <% end %>
            <% if current_user.blocked_friends.include?(friend) %>
            <%= form_for friendship, url: user_friendship_path(friendship), method: :delete do |form| %>
                  <%= submit_tag "Unblock", class: 'btn btn-danger' %>
            <% end %>  
            <%end%>
      </div>
</div>
<% end %>

モデル (必要なコードのみ)-> user_friendship.rb:

    class UserFriendship < ActiveRecord::Base

include Tire::Model::Search
include Tire::Model::Callbacks


  def self.search(params)
     tire.search(load: true) do
       query { string params[:query] } if params[:query].present?
     end
   end

  attr_accessible :user, :friend, :user_id, :friend_id, :state

  belongs_to :user

コントローラー -> user_friendship_controller.rb

 class UserFriendshipsController < ApplicationController


    before_filter :authenticate_user!
  respond_to :html, :json

    def index


    @user_friendships = current_user.user_friendships.all.search(params)


    case params[:list]
    when nil
      @user_friendships = current_user.pending_user_friendships.all + current_user.accepted_user_friendships.all + current_user.requested_user_friendships.all
    when 'Blocked'
      @user_friendships = current_user.blocked_user_friendships.all
    when 'Pending'
      @user_friendships = current_user.pending_user_friendships.all
    when 'Accepted'
      @user_friendships = current_user.accepted_user_friendships.all
    when 'Requested'
      @user_friendships = current_user.requested_user_friendships.all
    end
    respond_with @user_friendships
  end
4

2 に答える 2

1

検索メソッドが空の配列を返すようにする[]と、nilすべてがうまくいくはずではありません。

それは次のように見えるかもしれません

   def self.search(params)
     tire.search(load: true) do
       query { string params[:query] } if params[:query].present?
     end || []
   end
于 2013-06-14T19:03:30.597 に答える
0

このエラーは、各メッセージが送信されたときに @user_friendships が nil であることを示しています。おそらく、params[:list] case ステートメントで @user_friendships がどのように割り当てられているかで問題が発生しています。この params[:list] ケース ステートメントをトラブルシューティングして、ビューがレンダリングされているときに @user_friendships が nil である理由を理解する必要があります。アプリケーションをデバッグするか、params[:list] / @user_friendships の値をログに記録して、どのケースが呼び出されているかを確認し、呼び出されているケースが nil 値になる理由を突き止めることをお勧めします。幸運を!

于 2013-06-14T19:01:51.900 に答える