RJS:基于Ajax的select_tag

3

由于我在上一个问题中没有得到预期的答案,因此我将尝试简化和缩小我的问题:

如何构建一个下拉菜单,使用AJAX(无提交按钮)调用特定控制器的show操作?

以下是已知的内容:

模型关联类别HABTM项目,因此下拉菜单包含所有类别名称。

视图部分是下拉菜单应该实现的地方。下拉菜单下面是一个项目列表,应根据下拉菜单中所做的选择而更改:

   <!-- placeholder for AJAX dropdown menu -->

   <!-- list of projects related to categories chosen by the select tag -->
   <ul class="projects">
     <% @projects.each do |_project| %>
       <li>
         <%= link_to(_project.name, _project) %>
       </li>
     <% end %>
   </ul>

需要调用show-action的分类控制器(Categories controller):

class CategoriesController < ApplicationController
  def show
    # params[:id] should be the choice the user made in the dropdown menu
    @category = Category.find(params[:id])
    @projects = @category.projects.find(:all)

    respond_to do |format|
      format.html # show.html.erb
      format.js   # needed for ajax response?
    end
  end

  def index
    @projects = Category.find(params[:id]).projects.find(:all)
    @category = @project.categories.first

    respond_to do |format|
      format.html # index.html.erb
    end
  end 
end

在 Categories 控制器中调用 show-action 的路由:

category GET    /categories/:id    {:controller=>"categories", :action=>"show"}

你会如何实现这个?非常感谢任何帮助!
1个回答

7
这个怎么样:
<% form_for :category, :url => { :action => "show" } do |f| %>
  <%= select_tag :id, options_from_collection_for_select(Category.find(:all), :id, :name),
  { :onchange => "this.form.submit();"} %>
<% end %>

这将调用传统的html请求,因此它将刷新整个页面(并响应format.html)。

然后控制器将通过提交的[:id]查找类别。

@category = Category.find(params[:id])

不错!谢谢,我从没想过用JavaScript来进行传统的HTML调用。:category和:id会有什么值?它们不会是相同的吗? - Javier
这并不是必须的,但你需要使用select_tag,我已经更新了我的答案来展示如何使用。 - Chap

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接