Mik*_*len 4 ruby model-view-controller ruby-on-rails
这是我目前的代码:
<%= f.collection_select :category_id, Category.all, :id, :name, {prompt: "Choose a category"} %>
<%= f.collection_select :subcategory_id, Subcategory.all, :id, :name, {prompt: "Choose a subcategory"} %>
Run Code Online (Sandbox Code Playgroud)
它只是在一个下拉列表中显示所有类别,在另一个下拉列表中显示所有子类别.像这样
问题:如何根据所选的主要类别显示特定的子类别.使用上面的代码,它显示所有类别和所有子类别.
一切都在模型中链接,has_many和belongs_to ...和category_id和subcategory_id..everything正常工作,我只是不知道如何在所选类别中显示特定的子类别.
我的尝试:
<% if (Category.where(:name=>"Intro")) do |d| %>
<% d.subcategories.each do |subcategory| %>
<%= link_to subcategory.name, gigs_path(subcategory: subcategory.name) %>
<% end %>
<% end %>
Run Code Online (Sandbox Code Playgroud)
此代码出错.我要说,例如,如果用户选择名为"简介"的类别而不是列出所有"简介子类别".但它没有成功 - 我的代码显然是错误的.
谢谢.
我假设您希望在不重新加载页面的情况下发生这种情况?那么你不会得到一些JavaScript.这是一般工作流程:
为了这个例子,我将假设您的表单(属于某个类别的模型)是一个帖子.你似乎没有提到这个模型.
我们试试这个:
views/posts/_form:
我将在subcategories_selectdiv 中包装subategories selct框,这使我们可以在以后替换整个内容.
<%= f.collection_select :category_id, Category.all, :id, :name, { prompt: "Choose a category" }, id: "category_id" %>
<div id="subcategories_select">
<%= f.collection_select :subcategory_id, Subcategory.all, :id, :name, { prompt: "Choose a subcategory" }, { disabled: true } %>
</div>
Run Code Online (Sandbox Code Playgroud)
资产/ Java脚本/ posts.js.erb
# select the element to watch for changes
$('form').on('change', '#category_id'), function() {
var category_id = $(this).val(); # save the category_id set in the first dropdown
$.ajax({
url: "/categories/" + category_id + "/get_subcategories", # a custom route, see routes.rb further down
type: "GET",
dataType: "script", # we expect a response in js format
data: { "category_id": category_id } # the only value we will need to get the subcategories
});
});
Run Code Online (Sandbox Code Playgroud)
配置/ routes.rb中
# we need a custom route for our get_subcategories action
resources :categories do
member do
get :get_subcategories, defaults: { format: "js" }
end
end
Run Code Online (Sandbox Code Playgroud)
controllers/posts_controller.rb
重要提示:我假设类别has_many子类别和子类别具有category_id,这意味着属于一个类别.如果不是以下则没有意义.
# our custom controller action
def get_subcategories
@subcategories = Subcategory.where(category_id: params[:category_id])
end
Run Code Online (Sandbox Code Playgroud)
app/views/posts/get_subcategories.js.erb
这里我们将替换subsategories_select div的内容,并使用适当的选项插入collection_select.
$('#subcategories_select').html("<%= j collection_select(:post, :category_id, @subcategories, :id, :title), { prompt: 'Select subcategory...' }, { disabled: false } %>");
Run Code Online (Sandbox Code Playgroud)
请注意我从头顶做了这个,所以可能有错误,但这是动态填充选择框的一种方法,或者通常在不重新加载的情况下更改页面上的任何内容.