我假設你想這無需重新加載頁面發生的呢?那麼你不會繞過一些JavaScript。這裏的一般工作流程:
- 當類別下拉列表改變時,發送一個Ajax請求將與JavaScript的響應,並插入正確的值到子類別下拉菜單。
爲了這個例子我只是假設你的表單(屬於一個類別的模型)是一個帖子。你似乎沒有提到這個模型。
讓我們試試這個:
的意見/職位/ _form:
我將包裹的子類別SELCT箱在subcategories_select
DIV,這使我們後來更換整個內容。
<%= 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>
資產/ 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
});
});
配置/路線。RB
# we need a custom route for our get_subcategories action
resources :categories do
member do
get :get_subcategories, defaults: { format: "js" }
end
end
控制器/ posts_controller.rb
重要:我認爲一個類別的has_many子類別和子類別具有CATEGORY_ID,其meansbelong_to一個類別。如果這不是以下將是沒有意義的。
# our custom controller action
def get_subcategories
@subcategories = Subcategory.where(category_id: params[:category_id])
end
應用程序/視圖/職位/ get_subcategories.js.erb
在這裏,我們將取代我們subcategories_select div的內容並插入一個collection_select用適當的選項。
$('#subcategories_select').html("<%= j collection_select(:post, :category_id, @subcategories, :id, :title), { prompt: 'Select subcategory...' }, { disabled: false } %>");
請注意,我這樣做是從我的頭頂,所以有可能是錯誤的,但這是動態填充選擇框,或在頁面上一般改變什麼而無需重新加載一個方法。
@MikeMcCallen前端積極與後端通信的更多細節。所以來自'前端'的函數在'後端'調用函數,然後它接收結果並處理它們。我建議你閱讀更多關於ajax,並考慮網絡的工作原理;) –
我一定誤解了你的問題。在我看來,當用戶在第一個選項('選擇類別')中選擇一個選項時,您試圖更改第二個下拉菜單('選擇一個子類別')的內容。看起來你試圖在服務器端實現這一點,在某些圈子裏,這被認爲是錯誤的。 每當用戶更改第一個菜單中的選項,然後使用該響應來填充第二個菜單中的選項時,您可能會嘗試的是對您的控制器執行AJAX調用。但是,這又有點不正統。 –
這絕對可以在rails中實現。使用簡單的json API。除非我誤解你的回答。 –