1

モデルの1つに検索を実装しようとしています。私はgem"mongoid_search"を使用しており、検索時にrailscast#240と混合しています。空の配列を返しているようで、理由がわかりません。誰かが私を正しい方向に向けることができますか?

私のモデルは次のようになります。

include Mongoid::Search 

attr_accessible :twitterUsername, :twitterName, :twitterLocation, :twitterDescription, :projects

def self.search(search)
    if search
        search_in :twitterUsername, :twitterName, :twitterLocation, :twitterDescription, :projects
    else
        scoped
    end
end

私のコントローラー:

def index
    @users = User.search(params[:search])

    respond_to do |format|
        format.html # index.html.erb
        format.json { render json: @users }
    end
end

そして私の見解:

<%= form_tag users_path, :method => 'get', :id => "users_search" do %>
    <p>
        <%= text_field_tag :search, params[:search] %>
        <%= submit_tag "Search", :name => nil %>
    </p>
<% end %>

アップデート

モデルでtwitterUsername(命名規則が間違っていることをお詫びします)も定義します。

field :provider, :type => String
field :uid, :type => String
field :twitterName, :type => String
field :twitterUsername, :type => String
field :twitterAvatar, :type => String
field :twitterUrl, :type => String
field :twitterPortfolioUrl, :type => String
field :twitterLocation, :type => String
field :twitterDescription, :type => String
field :email, :type => String
field :description, :type => String
field :portfolioUrl, :type => String
field :watchers, :type => Integer
field :inspirations, :type => Integer
field :invitees, :type => Integer
field :shot, :type => String
field :remote_image_url, :type => String
field :hireMe, :type => Boolean
field :projects, :type => Integer
key :twitterUsername


def self.create_with_omniauth(auth)
    create! do |user|
        user.provider = auth['provider']
        user.uid = auth['uid']
        if auth['info']
            user._id = auth['info']['nickname'] || ""
            user.twitterName = auth['info']['name'] || ""
            user.twitterUsername = auth['info']['nickname'] || ""
            user.twitterAvatar = auth['info']['image'] || ""
            user.twitterUrl = auth['info']['urls']['Twitter'] || ""
            user.twitterPortfolioUrl = auth['info']['urls']['Website'] || ""
            user.twitterLocation = auth['info']['location'] || ""
            user.twitterDescription = auth['info']['description'] || ""
        end
    end
end

更新2

ユーザーを数えると、1人のユーザーが戻ってきているようです(現在サインアップしているのは私だけなので、これは正しいです)。

<% if @users.count > 0 %>
  <%= @users.count %>
<% end %>

私が行った場合:

<% if @users.count > 0 %>
  <%= @users.twitterUsername %>
<% end %>

それは私にこのエラーを与えます:User:Classの未定義のメソッド`twitterUsername'。

更新3

tail log / development.logを実行しようとすると、エラーが発生します。

± % tail log/development.log                                                                                                             
22:     
app/views/users/index.html.erb:19:in `block in _app_views_users_index_html_erb__1766206529136141992_2490506940'
app/views/users/index.html.erb:18:in `each'
app/views/users/index.html.erb:18:in `_app_views_users_index_html_erb__1766206529136141992_2490506940'
app/controllers/users_controller.rb:7:in `index'


Rendered /Users/holgersindbaek/.rbenv/versions/1.9.3-p125-perf/lib/ruby/gems/1.9.1/gems/actionpack-3.2.2/lib/action_dispatch/middleware/templates/rescues/_trace.erb (5.3ms)
Rendered /Users/holgersindbaek/.rbenv/versions/1.9.3-p125-perf/lib/ruby/gems/1.9.1/gems/actionpack-3.2.2/lib/action_dispatch/middleware/templates/rescues/_request_and_response.erb (1.2ms)
Rendered /Users/holgersindbaek/.rbenv/versions/1.9.3-p125-perf/lib/ruby/gems/1.9.1/gems/actionpack-3.2.2/lib/action_dispatch/middleware/templates/rescues/template_error.erb within rescues/layout (13.9ms)

更新4

検索を実行すると、コンソールにこれが表示されます。

Started GET "/users?utf8=%E2%9C%93&search=holgersindbaek" for 127.0.0.1 at 2012-04-10     23:24:55 +0200
Processing by UsersController#index as HTML
Parameters: {"utf8"=>"✓", "search"=>"holgersindbaek"}
MONGODB (1ms) flow04_development['users'].find({:_id=>"holgersindbaek"}).limit(-1).sort([[:_id, :asc]])
Rendered users/index.html.erb within layouts/application (4.7ms)
Completed 500 Internal Server Error in 8ms

ActionView::Template::Error (undefined method `id' for User:Class):
22:         <% if current_user == user %>
23: 
24:         <% else %>
25:           <% if current_user.follower_of?(user) %>
26:             <%= link_to "Unfollow", unfollow_user_path(user), :remote => true,     :class=>'unfollow' %>
27:           <% else %>
28:             <%= link_to "Follow", follow_user_path(user), :remote => true, :class=>'follow' %>
app/views/users/index.html.erb:25:in `block in _app_views_users_index_html_erb__83132873031271873_2505118720'
app/views/users/index.html.erb:18:in `each'
app/views/users/index.html.erb:18:in `_app_views_users_index_html_erb__83132873031271873_2505118720'
app/controllers/users_controller.rb:7:in `index'
4

2 に答える 2

0

問題は、私が見ているように、mongoid-searchは、ドキュメントを保存するときに「_keywords」という名前の属性をドキュメントに追加することです。次に、「_keywords」に基づいてドキュメントを検索します

したがって、コレクションのインデックスを効果的に再作成する必要があります。これを試して:

ユーザーモデルに追加

field :reindexed, type: Boolean, default: false

次を実行します

User.where(reindexed: false).each {|u| u.reindexed = true; u.save}

それからあなたが検索するとき、それは幸せであるはずです。

于 2012-04-10T16:06:51.443 に答える
0

if/elseステートメントで検索を行わないことになりました。やった:

search_in :twitterUsername, :twitterName, :twitterLocation, :twitterDescription

それと同じくらい簡単です。インデックスは他の目的には使用していないため、検索に使用しています。

于 2012-04-17T17:01:12.253 に答える