モデル構成はこんな感じ。
UserとProjectがm:n
ProjectHistoryが中間テーブル。has_and_belongs_to_manyでもいいぐらいのテーブル
Userが複数のProjectというタグを持つイメージ
また、一つのタグは複数のユーザーにも共有される。
使用したjavascriptは
jquery.tagsinput.js
jquery-ui.js
オートコンプリート機能つきです。
ソースコードは、どうでもいいところは省略しています。
class User < ActiveRecord::Base has_many :project_histories has_many :projects, :through => :project_histories attr_accessor :project_tags end
class ProjectHistory < ActiveRecord::Base attr_accessible :project_id, :user_id belongs_to :user belongs_to :project end
class Project < ActiveRecord::Base attr_accessible :name endusers_controllerの実装
def new @user = User.find(params[:id]) end def create @user = User.new project_tags = params[:user].fetch("project_tags") params[:user].delete("project_tags") Project.transaction do tags = project_tags.split(",").uniq tags.each do |v| @user.projects << Project.new(name: v) end end respond_to do |format| end end def edit @user = User.find(params[:id]) @user.project_tags = @user.projects.map(&:name).join(",") end def update @user = User.find(params[:id]) project_tags = params[:user].fetch("project_tags") params[:user].delete("project_tags") Project.transaction do @user.projects.clear tags = project_tags.split(",").uniq tags.each do |v| pro = if Project.find_by_name(v) Project.find_by_name(v) else Project.new(name: v) end @user.projects << pro end end respond_to do |format| if @user.update_attributes(params[:user]) format.html { redirect_to @user, notice: 'User was successfully updated.' } format.json { head :no_content } else format.html { render action: "edit" } end end endAPI用のprojects_controllerの実装
def index @projects = Project.find(:all, :conditions => ["name LIKE ?", "%"+params[:term]+"%"]) val = [] @projects.each do |project| v = {} v[:value] = project.name val << v end respond_to do |format| format.json { render json: val } end end_form.html.erbの実装
<%= simple_form_for(@user) do |f| %> <%= f.input :project_tags %><%= f.submit(:class => "btn btn-primary") %><% end %>
0 件のコメント:
コメントを投稿