Rails自动完成用户对象

Tre*_*ler 7 ruby-on-rails

在我的应用程序中,用户属于一个组,这是在我的用户组模型中完成的.

class Usergroup < ApplicationRecord
  belongs_to :user
  belongs_to :group
end

class User < ApplicationRecord
  has_many :usergroups
  has_many :groups, through: :usergroups
end

class Group < ApplicationRecord
  has_many :usergroups
  has_many :users, through: :usergroups
end
Run Code Online (Sandbox Code Playgroud)

当我想将添加usergroup,虽然我需要知道的标识group和的标识user是不太理想.我使用jQuery创建了一个自动完成字段来为我处理这个问题.

<%= form_with(model: usergroup, local: true) do |form| %>

  <div class="field">
    <%= form.label :user_id %>
    <%= form.text_field :user_id, id: 'user', data: { autocomplete_source: User.order(:email).map(&:email) } %>
  </div>

  <%= form.submit %>
<% end %>
Run Code Online (Sandbox Code Playgroud)

当我尝试usergroup使用我从此下拉菜单中选择的电子邮件创建新邮件时,它正在提交,因为它要求有一个用户.如何将完整的用户对象传递给此字段而不仅仅是我要创建的用户的电子邮件?我接近这个吗?

这是用于获取用户的路由.

user GET    /users/:id(.:format)      users#index
Run Code Online (Sandbox Code Playgroud)

MZa*_*oza 2

当我必须从一个大列表中找到一个值时,我喜欢使用 gem “select2-rails”gem

你可以编写一个 Ajax 代码来获取你的值,如下所示

class UserController < ApplicationController
  respond_to :html, :json

  def index
    if params[:email].present?
      @users = User.where(email: params[:email])
    else
      @users = User.all
    end
    respond_with @users
  end
end
Run Code Online (Sandbox Code Playgroud)

在你的 HTML 中你需要的一切

<div class="field">
  <%= form.label :user_id %>
  <%= form.hidden_field :user_id, id: 'user_id', class: 'select2' %>
</div>
Run Code Online (Sandbox Code Playgroud)

在你的JS中

$(document).ready(function() {
  $('.select2').select2({
    ajax: {
      url: "<%= user_path(format: :json) %>",
      dataType: "json",
      results: function(data, page) {
        return { 
          results: $.map( data, function(user, i) { 
            return { id: user.id, text: user.email } 
          } )
        }
      }
    }
  });
});
Run Code Online (Sandbox Code Playgroud)

我希望这对您有用或为您指明正确的方向