我有一个3类/子类别/子类别依赖下拉列表,一切正常,但我有一个小问题。第二个下拉列表(子类别)并不总是有子类别,所以我想隐藏最后一个下拉列表,只在有子类别时显示它,所以它只显示基于用户选择的子类别。
如果有人能帮忙我会很感激的。

我的分类表
create_table :categories do |t|
t.string "name", limit: 255
t.text "description", limit: 65535
t.integer "parent_id", limit: 4
t.boolean "important", default: false
t.integer "position", limit: 4, default: 0
t.timestamps
end在模块中category.rb
class Category < ApplicationRecord
validates :name, presence: true
has_many :jobs
belongs_to :parent, foreign_key: :parent_id, class_name: 'Category' , :optional => true
has_many :subcategories, foreign_key: :parent_id, class_name: 'Category'
has_many :subsubcategories, foreign_key: :parent_id, class_name: 'Category'
end在模块中job.rb
class Job < ApplicationRecord
validates :title,:category_id, :description, presence: true
validates :category, :presence => true
belongs_to :user
belongs_to :category , -> { order("name") }
belongs_to :subcategories, class_name: "Category"
belongs_to :subsubcategories, class_name: "Category"
enddropdown_controller.js
import { Controller } from "@hotwired/stimulus";
// connect to data-controller="dropdown"
export default class extends Controller {
submit () {
this.element.requestSubmit();
}
}在我的jobs_controller.rb里
class JobsController < ApplicationController
before_action :authenticate_user!, except: [:index, :show]
before_action :set_categories
def index
@jobs = Job.all
end
def new
@category = Category.find_by(id: params[:category])
@categories = Category.where(parent_id: nil)
@subcategories = @category.subcategories if @category
@subsubcategories = Category.where(:parent_id => params[:subcategories])
@job = Job.new
end
def create
@job = Job.new(job_params.merge({ user: current_user }))
if @job.save
format.html { redirect_to root_path, notice: "Job was successfully created." }
else
render :new, status: :unprocessable_entity
end
end
private
def job_params
params.require(:job).permit(:title, :description,:category_id).merge(user: current_user)
end
def set_categories
@category = Category.find_by(id: params[:category].presence)
@subcategory = Category.find_by(id: params[:subcategories])
@subsubcategory = Category.find_by(id: params[:subsubcategories])
end
end视图/作业/new.html.erb
<%= turbo_frame_tag "form" do %>
<%= form_tag new_job_path, method: :get, data: { controller: "dropdown", action: "change->dropdown#submit" } do %>
<%= select_tag :category, options_from_collection_for_select(@categories, "id", "name", @category&.id ), prompt: "Select a category" %>
<%= select_tag :subcategories, options_from_collection_for_select(@subcategories || [], "id" , "name", @subcategory&.id), prompt: "Select a subcategories category" %>
<%= select_tag :subsubcategories, options_from_collection_for_select(@subsubcategories || [], "id" , "name", @subsubcategory&.id), prompt: "Select a subsubcategories category" %>
<% end %>
<% end %>发布于 2022-11-16 12:54:12
你为什么不把它藏起来。类似于将视图/作业/new.html.erb更改为如下所示:
<%= turbo_frame_tag "form" do %>
<%= form_tag new_job_path, method: :get, data: { controller: "dropdown", action: "change->dropdown#submit" } do %>
<%= select_tag :category, options_from_collection_for_select(@categories, "id", "name", @category&.id ), prompt: "Select a category" %>
<%= select_tag :subcategories, options_from_collection_for_select(@subcategories || [], "id" , "name", @subcategory&.id), prompt: "Select a subcategories category" %>
<% if @subsubcategories.any? %>
<%= select_tag :subsubcategories, options_from_collection_for_select(@subsubcategories || [], "id" , "name", @subsubcategory&.id), prompt: "Select a subsubcategories category" %>
<% end %>
<% end %>
<% end %>发布于 2022-11-16 15:18:49
实际上,没有Javascript,我让它完全按照我的要求工作::
<% if !@subsubcategories.blank? %>
<%= select_tag :subsubcategories , options_from_collection_for_select(@subsubcategories || [], "id" , "name", @subsubcategory&.id), prompt: "Select a subsubcategories category" %>
<% end %>https://stackoverflow.com/questions/74459507
复制相似问题