インクリメンタル検索
Q&A
Closed
解決したいこと
Ruby on RailsでtwitterのようなWebアプリをつくり、インクリメンタル検索を実装しています。
投稿した記事(movie)と投稿したユーザーをajaxで取得し表示する際にエラーが発生しました。
発生している問題・エラー
NoMethodError: undefined method `user' for #<Movie::ActiveRecord_Relation:0x000000000a7337a0>
Did you mean? super
from C:/Ruby27-x64/lib/ruby/gems/2.7.0/gems/activerecord-5.2.5/lib/active_record/relation/delegation.rb:125:in `method_missing'
movie.model
class Movie < ApplicationRecord
validates :content, {presence: true, length: {maximum: 1000}}
validates :user_id,{presence: true}
def user
return User.find_by(id: self.user_id)
end
def self.search(search)
return put "見つかりませんでした" unless search
Movie.where(['content LIKE?',"%#{search}%"])
end
has_many :comment,foreign_key: :reply_comment,dependent: :destroy
belongs_to :user
end
movie.js
$(document).on('turbolinks:load',function(){
$(function () {
$('.js-text_field').on('keyup', function () {
var content = $.trim($(this).val());
$.ajax({
type: 'GET',
url: '/movies/search',
data: {content: content},
dataType: 'json'
})
.done(function(data){
$('.js-movie-indexes').empty();
$(data).each(function(user,movie) {
$('.js-movie-indexes').append(
`
<img src="/user_images/${user.image_name}">
<p href="/users/${user.id}">${user.id}</p>
<p>${movie.title}</p>
<p href="/movies/${movie.id}">${movie.content}</p>
'
);
});
})
.fail(function(){
console.log('通信に失敗しました');
})
});
});
});
movies_controller
def search
@movie = Movie.search(params[:content])
@user = @movie.user
respond_to do |format|
format.html {redirect_to :root}
format.json {render json:[@movie,@user]}
end
end
routes
search_movies GET /movies/search(.:format)
movies#search {:format=>:json}
index.html.erb
<%= form_with(url:movies_searches_path,:method => 'get') do |f| %>
<%= f.text_field :search,id:'search' ,class: 'js-text_field'%>
<%= f.submit "検索", :name => nil %>
<%end%>
0