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
https://github.com/activerecord-hackery/ransack/issues/1444
https://github.com/activerecord-hackery/ransack/issues/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| %>
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'
実現したいこと
投稿一覧の検索ボタンを押すと検索結果が表示される
実現するために自分が選んだ手段とその理由
ransack カリキュラムでやったことを参考にできるため elasticsearchを導入しようとしたがうまくいかなかった
その手段を使って実装するために参考にした公式ドキュメントや技術記事
https://qiita.com/mmaumtjgj/items/8731a70b3f328770867c
参考にしたものと自分の実装で違う箇所・もしくは違う箇所はなくまったく同じ実装方法をしている(どういう実装をすれば実現できるのかを理解しているのかどうか
コントローラーや、ビューの設定は問題ないかと思われます。
エラーが出ているのかエラーが出ていないのか、エラーが出ているのであればどんなエラーが出ているのか
検索するとでるエラー↓
NoMethodError in PostsController#index
カリキュラムを参照したとのことであればransackのアップデートが関係しているかもです カリキュラムで扱っているransackは3系、最新のものは4系となりますが、導入方法に大幅な変更がありました
rails ransack4
等で検索してみて自分の行った導入方法と間違いなさそうか確認していただけるとよいかなと思いますransack4では、モデルへ個別の検索条件設定がいるとのことで追加で変更しましたが、まだ同じエラーが出ている状態です。
こちらの記事を参考にしました https://zenn.dev/s17w09/articles/62352ccfa4b3eb https://activerecord-hackery.github.io/ransack/going-further/other-notes/#authorization-allowlistingdenylisting
rails consoleでは動いているようです。
追加したコード initializers/ransack.rb
model/user
model/post
development.log
いろいろ自分でも調べてみましたが、解決できる方法が見つかりませんでした。 この場合どうしたらいいでしょうか。
rails console上では動いているとのことなので変更したファイルの反映出来ていないのかなと思いますので一度rails serverを再起動するためdocker compose downとdocker compose upをしてみるとよいかもしれません