在Rails 4中显示所选类别的子类别

时间:2015-05-30 16:19:14

标签: javascript ruby-on-rails ruby-on-rails-4 model-view-controller coffeescript

1。在我的**视图/ gigs / new.html.erb 中,我使用

 <%= 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"} %>

它创建了这个

dropdown category and subcategory

点击下图:

the dropdown categories and subcategories

根据您选择的类别,从上图中可以看出,只显示该类别拥有的子类别。

2。在我的演出控制器中,我可以编写以下代码。

def update_sub_categories
  @cats = Subcategory.where(category_id: params[:category_id]).all
  respond_with(@cats)
end

3. 我必须在同一个文件夹中创建一个文件 view / gigs / update_sub_categories 并把这段代码

$("#gig_subcategory_id").empty().append("<%= escape_javascript(render(:partial => "subcategory", :collection => @cats, :as => :cat)) %>")

同样在同一文件夹中的部分v iew / gigs / _subcategory.html.erb

<option value="<%= cat.id %>"><%= cat.name %></option>

4. 加入 App / javascript / gigs.js.coffee

  $(document).on 'change', '#gig_category_id', (evt) ->
    $.ajax 'update_sub_categories',
      type: 'GET'
      dataType: 'script'
      data: {
        category_id: $("#gig_category_id option:selected").val()
      }
      error: (jqXHR, textStatus, errorThrown) ->
        console.log("AJAX Error: #{textStatus}")
      success: (data, textStatus, jqXHR) ->
        console.log("Dynamic country select OK!")

5. 最后在路线

get 'gigs/update_sub_categories' => 'gigs#update_sub_categories'
  

问题:一切正常,我选择所选类别的类别和子类别。但它只适用于    views / gigs / new.html.erb ,而不是 views / gigs / edit.html.erb ,我做错了什么?

1 个答案:

答案 0 :(得分:1)

查看您的控制台或development.log,您将看到一条消息,指示当脚本失败时rails无法解析update_sub_categories。当用新表单调用该方法时,你会看到rails正在调用your_controller/your_action/update_sub_categories - 你可能会看到它现在的位置。

你将不得不更新你的routes.rb来处理对该方法的“裸”调用(当它缺少your_action时)以及成员路由。显式处理成员路由是必要的,因为您的编辑使用路径中嵌入的ID字段,而不是在末尾附加。

使用以下内容替换routes.rb中的当前路由,您应该处于良好状态:

  get 'update_sub_categories' => 'your_model#update_sub_categories'

  get 'your_model/update_sub_categories' => 'your_model#update_sub_categories'

  resources :your_model do
    get :update_sub_categories, :on => :member
  end

显然,在我的示例中,您将要将模型名称替换为字符串your_model