【问题标题】:Ruby on Rails - Forms with belongs_to associationRuby on Rails - 具有 belongs_to 关联的表单
【发布时间】:2014-03-31 18:39:36
【问题描述】:

在 Rails 4 上。我有三个模型(针对这个问题):UsersOrganizationsUserOrganizations。用户可以有很多组织,组织也可以有很多用户。此关系使用user_idorganization_id 存储在UserOrganizations 中。因此,UserOrganizations 属于用户和组织。

当我想添加一个新的用户/组织关系时,user_id 会自动从当前登录的用户中获取。但是,要将那个用户分配给一个组织,我有一个下拉选择,列出了所有组织数据库(按名称)。

这在开发环境中很好,但当我最终将拥有超过一千个组织时就不那么好了。

我想做的是有一种文本查找输入,用户可以在其中输入组织的名称,然后将显示数据库中包含该名称的所有组织。然后用户可以选择名称(也许通过单选按钮?)告诉应用程序他/她想被分配到哪个组织。理想情况下,这将发生在同一页面上/无需重新加载。

创建此表单的最佳方法是什么?是否有宝石或其他东西可以轻松做到这一点?你可以用formtastic甚至没有宝石来做到这一点吗?感谢您的帮助。

【问题讨论】:

    标签: ruby-on-rails forms belongs-to


    【解决方案1】:

    制作一个 text_field_tag(用于搜​​索)。

    <%= text_field_tag(:for_search, "", :onchange=> "search_orgs(this)") %>
    

    在该 text_field 的 onchange 事件上,放置一个运行 AJAX 请求的 JS 函数,该请求将您要搜索的字符串作为参数发送。

    <script>
       function search_orgs(theString)
       {
         var dataString = 'string='+theString;
         $.ajax(
         {  
           type: "GET",  
           url: "/your_path/show(or_create)",  
           data: dataString  
         }); 
         return false;
       }
    </script>
    

    这样,每次您的文本字段更改时,您输入的字符串都会作为参数发送到控制器(在本例中为 show 方法)。

    在您的 show 方法中,捕获参数,使用它来过滤您的数据,然后填充 select_tag。

    你的控制器

    def show
      string = params[:string]
      yourFiltered_data = Yourmodel.where("name ILIKE = '#{string}'").all
      yourFiltered_data .each do |d|  
        @htmlSelect+="<option value = #{d.organization_id}>#{d.organization_name}</option>"     
      end
    end
    

    现在,在您的视图文件夹中的 show.js.erb 文件中,您将其放入

    show.js.erb 文件

    $(document.getElementById("theOrgs").innerHTML = '<%= select_tag :organization_id, @htmlSelect.html_safe %>')
    

    这样,每当您的文本框值更改时,select_tag 选项也会更改,并且只会显示那些名称中包含您提交的字符串的公司。

    希望这会有所帮助!

    【讨论】:

      【解决方案2】:

      您可能应该看看rails3-jquery-autocomplete gem。它有相当多的文档和示例。或多或少:

      型号:

      class UserOrganization < ActiveRecord::Base
        attr_accessor :organization_name
      end
      

      控制器:

      class UserOrganizationsController < Admin::BaseController
        autocomplete :organization, :name
      end
      

      路线:

      resources :user_organizations do
        get :autocomplete_organization_name, :on => :collection
      end
      

      查看:

      form_for(@user_organization) do |f|
        f.hidden_field :organization_id, id: 'org_id'
        f.autocomplete_field :organization_name, autocomplete_organization_name_user_organizations_path, id_element: '#org_id'
      end
      

      它还提供与SimpleFormFormtastic 的集成。

      【讨论】:

      • 嗯,这对我不起作用,即使在多次重新启动服务器后也是如此。首先,在视图中,(请记住,我正在查找组织,并且我希望通过组织的 :name 进行搜索)是 :organization_name 还是只是 :organization ?保持它为 :organization_name 返回未定义的方法 `organization_name' (我已经更改了路由/控制器)。将其更改为 :organization 没有加载错误,但根本不存在自动完成功能。这适用于 Rails 4 吗?我究竟做错了什么?看起来很简单,但...
      • 更新:我决定改用 select2 gem。更容易,我立即得到了它的工作。
      • 另一个不错的选择:),我也使用它。我将编辑答案添加一些说明。
      猜你喜欢
      • 2011-04-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-23
      • 2014-03-24
      相关资源
      最近更新 更多