有人可以帮我找出为什么它不起作用吗? 那么故事是什么呢:有一个 Rails 7 (7.1.3) 博客应用程序,其版本为 4.1.1
在搜索表单中,我需要按帖子标题和帖子正文搜索文本 我收到这个错误
nil 的未定义方法“type”:NilClass
在参数中我可以看到这个
参数:
{"q"=>{"title_or_body_cont"=>"应该"}, "提交"=>"搜索"}
当我尝试仅使用 title_cont 这样的标题进行搜索时,一切正常,但是当使用 body_cont 或 title_or_body_cont 进行搜索时,会出现上述错误。我认为这是因为 Post 模型没有 body 字段,而该字段位于 action_text_rich_texts 表中。在 Post 模型中的 action_text_rich_texts 表上添加关联后,我仍然遇到上述错误。我将感谢您的帮助。
和我的代码
class Post < ApplicationRecord
has_rich_text :body
has_many :comments, dependent: :destroy
belongs_to :user
has_one_attached :post_image
validates :title, presence: { message: 'must be given please' }, length: { minimum: 5 }
validates :body, presence: true, length: { minimum: 10 }
validate :post_body_length
validate :acceptable_image
def self.ransackable_attributes(_auth_object = nil)
%w[title body created_at updated_at user_id]
end
def self.ransackable_associations(_auth_object = nil)
%w[users action_text_rich_texts]
end
private
def acceptable_image
return unless post_image.attached?
errors.add(:post_image, 'is too big') unless post_image.blob.byte_size <= 5.megabyte
acceptable_types = ['image/jpeg', 'image/png']
return if acceptable_types.include?(post_image.content_type)
errors.add(:post_image, 'must be a JPEG or PNG')
end
def post_body_cant_be_empty
if self.body.blank?
self.errors.add(:body, "can't be empty")
end
end
def post_body_length
if self.body.to_plain_text.length < 10
self.errors.add(:body, 'is too short (minimum is 10 characters)')
end
end
end
还有一个searchs_controller
class SearchesController < ApplicationController
def index
@query = Post.ransack(params[:q])
@posts = @query.result.includes(:rich_text_body)
end
end
和一个搜索表单
<%= search_form_for @query, url: searches_path, method: :get, html: { class: "d-flex", role: "search" } do |f| %>
<%= f.search_field :title_or_body_cont, class: "form-control me-2", placeholder: "Search title or body..." %>
<%= f.submit "Search", class: "btn btn-outline-secondary-light btn-sm" %>
<% end %>
和路线
resources :searches, only: %i[index]
帖子表结构
create_table "posts", force: :cascade do |t|
t.string "title", null: false
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.bigint "user_id", null: false
t.index ["user_id"], name: "index_posts_on_user_id"
end
Action_text_rich_texts表结构
create_table "action_text_rich_texts", force: :cascade do |t|
t.string "name", null: false
t.text "body"
t.string "record_type", null: false
t.bigint "record_id", null: false
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.index ["record_type", "record_id", "name"], name: "index_action_text_rich_texts_uniqueness", unique: true
end
感谢您的建议。它有效。
我将 Post 模型中的关联更新为
rich_text_body
并在搜索表单 search_field 中修复搜索位置
title_or_rich_text_body_body_cont
进行此调整后,一切正常。