Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

検索機能のエラーが解決できない #59

Open
denryuuu opened this issue Sep 9, 2024 · 3 comments
Open

検索機能のエラーが解決できない #59

denryuuu opened this issue Sep 9, 2024 · 3 comments

Comments

@denryuuu
Copy link
Owner

denryuuu commented Sep 9, 2024

実現したいこと

投稿一覧の検索ボタンを押すと検索結果が表示される

実現するために自分が選んだ手段とその理由

ransack
カリキュラムでやったことを参考にできるため
elasticsearchを導入しようとしたがうまくいかなかった

その手段を使って実装するために参考にした公式ドキュメントや技術記事

https://qiita.com/mmaumtjgj/items/8731a70b3f328770867c

参考にしたものと自分の実装で違う箇所・もしくは違う箇所はなくまったく同じ実装方法をしている(どういう実装をすれば実現できるのかを理解しているのかどうか

コントローラーや、ビューの設定は問題ないかと思われます。

エラーが出ているのかエラーが出ていないのか、エラーが出ているのであればどんなエラーが出ているのか

検索するとでるエラー↓

NoMethodError in PostsController#index

undefined method `table_name' for #<Arel::Table:0x00000001140940b0 @name="posts", @klass=Post(id: integer, title: string, content: text, created_at: datetime, updated_at: datetime, location_name: string, address: string, image: string, user_id: integer), @type_caster=#<ActiveRecord::TypeCaster::Map:0x0000000112ebbf28 @klass=Post(id: integer, title: string, content: text, created_at: datetime, updated_at: datetime, location_name: string, address: string, image: string, user_id: integer)>, @table_alias=nil>
Did you mean?
  • table_alias
Extracted source (around line #3):
1 2 3 4 5 6 | class PostsController < ApplicationController def index @q = Post.ransack(params[:q]) @posts = @q.result(distinct: true).includes(:user, :comments).order(created_at: :desc).page(params[:page]) end -- | --

検証ツールのエラー↓
A form field element has neither an id nor a name attribute. This might prevent the browser from correctly autofilling the form.
To fix this issue, add a unique id or name attribute to a form field. This is not strictly needed, but still recommended even if you have an autocomplete attribute on the same element.

posts:1 The resource http://localhost:3000/assets/application.bootstrap-6cb5c0ea3b32369152b1fd6bb459fb38372b690c0825394598a14def687566fb.css was preloaded using link preload but not used within a few seconds from the window's load event. Please make sure it has an appropriate as value and it is preloaded intentionally.
posts:1 The resource http://localhost:3000/assets/application-d15c7a29ec23296836d943519e533da4125e54a30f559cded3ac1224d9f3343f.css was preloaded using link preload but not used within a few seconds from the window's load event. Please make sure it has an appropriate as value and it is preloaded intentionally.

そのエラーの内容から推測したエラーの原因

table_nameメソッドがArel::Table` オブジェクトで呼び出されていること
また、ransack(4.2.1)とrails (7.1.3.2)のバージョンの互換性については問題ないと思われる
エラーの原因を解決するために自分で調べた記事
https://it.kensan.net/rails7-1-ransack-4.html
activerecord-hackery/ransack#1444
activerecord-hackery/ransack#1420

調べた記事を元に自分で行った対処法とその結果

models/application_record.rbの内容を変更

class ApplicationRecord < ActiveRecord::Base
  primary_abstract_class

  def self.ransackable_attributes(auth_object = nil)
    %w[title content]
  end

  def self.ransackable_associations(auth_object = nil)
    %w[user comments]
  end
end

initializers/ransack.rbの内容を変更

class Arel::Table
  def table_name
    name
  end
end

など試しましたが、変化なしでした。

その他の関係するコード
posts_controller.rb

class PostsController < ApplicationController
  def index
    @q = Post.ransack(params[:q])
    @posts = @q.result(distinct: true).includes(:user, :comments).order(created_at: :desc).page(params[:page])
  end

_search_form.html.erb

<%= search_form_for q, url: url do |f| %>
<div class="input-group mb-3">
  <%= f.text_field :title_or_content_cont, class: 'form-control', placeholder: t('defaults.search_word') %>
  <div class="input-group-append">
    <%= f.submit '検索', class: 'btn btn-primary' %>
  </div>
</div>
<% end %>

index.html.erb

<% content_for :title, "聖地一覧 | EBC MAP" %>
<div class="container pt-5">
  <div class="row mb-4">
    <div class="col-lg-10 offset-lg-1">
      <%= render 'search_form', q: @q, url: posts_path %>
    </div>
  </div>
@kenchasonakai
Copy link

カリキュラムを参照したとのことであればransackのアップデートが関係しているかもです
カリキュラムで扱っているransackは3系、最新のものは4系となりますが、導入方法に大幅な変更がありました
rails ransack4等で検索してみて自分の行った導入方法と間違いなさそうか確認していただけるとよいかなと思います

@denryuuu
Copy link
Owner Author

ransack4では、モデルへ個別の検索条件設定がいるとのことで追加で変更しましたが、まだ同じエラーが出ている状態です。

こちらの記事を参考にしました
https://zenn.dev/s17w09/articles/62352ccfa4b3eb
https://activerecord-hackery.github.io/ransack/going-further/other-notes/#authorization-allowlistingdenylisting

rails consoleでは動いているようです。

irb(main):008> Post.ransack(title_or_content_cont: '投稿').result
  Post Load (0.9ms)  SELECT "posts".* FROM "posts" WHERE ("posts"."title" ILIKE '%投稿%' OR "posts"."content" ILIKE '%投稿%') /* loading for pp */ LIMIT $1  [["LIMIT", 11]]
=> 
[#<Post:0x0000000113adb1a0
  id: 7,
  title: "タグテスト",
  content: "テスト投稿",
  created_at: Fri, 06 Sep 2024 11:12:13.079921000 UTC +00:00,
  updated_at: Fri, 06 Sep 2024 11:12:13.079921000 UTC +00:00,
  location_name: "testplace",
  address: "testtest",
  image: "ebisuzou.jpeg",
  user_id: 1>]

追加したコード
initializers/ransack.rb

Ransack.configure do |config|

    # Change default search parameter key name.
    # Default key name is :q
    config.search_key = :query
  
    # Raise errors if a query contains an unknown predicate or attribute.
    # Default is true (do not raise error on unknown conditions).
    config.ignore_unknown_conditions = false
  
    # Globally display sort links without the order indicator arrow.
    # Default is false (sort order indicators are displayed).
    # This can also be configured individually in each sort link (see the README).
    config.hide_sort_order_indicators = true
  
end

class Arel::Table
  def table_name
    name
  end
end

model/user


  def self.ransackable_attributes(auth_object = nil)
    %w[name created_at updated_at email]
  end

  def self.ransackable_associations(auth_object = nil)
    %w[posts]
  end

model/post

  def self.ransackable_attributes(auth_object = nil)
    %w[title content created_at updated_at location_name address image user_id]
  end

  def self.ransackable_associations(auth_object = nil)
    %w[user comments]
  end
class ApplicationRecord < ActiveRecord::Base
  primary_abstract_class
  def self.ransackable_attributes(auth_object = nil)
    authorizable_ransackable_attributes
  end
  def self.ransackable_associations(auth_object = nil)
    authorizable_ransackable_associations
  end
end

development.log

Started GET "/posts?q%5Buser_name_or_title_or_content_cont%5D=%E6%A4%9C%E7%B4%A2&commit=%E6%A4%9C%E7%B4%A2" for ::1 at 2024-09-10 21:00:40 +0900
Processing by PostsController#index as HTML
  Parameters: {"q"=>{"user_name_or_title_or_content_cont"=>"検索"}, "commit"=>"検索"}
  �[1m�[36mUser Load (0.5ms)�[0m  �[1m�[34mSELECT "users".* FROM "users" WHERE "users"."id" = $1 LIMIT $2�[0m  [["id", 1], ["LIMIT", 1]]
Completed 500 Internal Server Error in 6ms (ActiveRecord: 0.5ms | Allocations: 2769)


  
NoMethodError (undefined method `table_name' for #<Arel::Table:0x0000000113dfb010 @name="users", @klass=User(id: integer, email: string, crypted_password: string, salt: string, created_at: datetime, updated_at: datetime, first_name: string, last_name: string, avatar: string, location: string, favorite: string), @type_caster=#<ActiveRecord::TypeCaster::Map:0x000000010e933ac8 @klass=User(id: integer, email: string, crypted_password: string, salt: string, created_at: datetime, updated_at: datetime, first_name: string, last_name: string, avatar: string, location: string, favorite: string)>, @table_alias=nil>):
  
app/controllers/posts_controller.rb:3:in `index'

いろいろ自分でも調べてみましたが、解決できる方法が見つかりませんでした。
この場合どうしたらいいでしょうか。

@kenchasonakai
Copy link

rails console上では動いているとのことなので変更したファイルの反映出来ていないのかなと思いますので一度rails serverを再起動するためdocker compose downとdocker compose upをしてみるとよいかもしれません

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants