Rails:使用jquery tokeninput(railscast#258)创建新条目

我已经成功地实现了新的艺术家条目的添加,这些条目未包括在Ryan Bates的轨道广播中#258 http://railscasts.com/episodes/258-token-fields

换句话说,用户可以输入一个艺术家名称,该名称将使用jquery tokinput自动完成。 但是,我希望自动填充结果只显示由该个人用户创建的艺术家名称。

这有意义吗? 一个更好,更容易理解的例子是collection.rb,其中用户创建post并为post指定一个“集合”,但他们应该只能将post添加到他们自己创建的集合中。

这是使用artist_tokens作为虚拟属性的post表单:

 true, :html => {:multipart => true} do |f| %>  f.object %> 



@post.artists.map(&:attributes).to_json %>

这会通过在post表单上输入artist_tokens字段的值来查找艺术家,并且还添加了“添加{params [:q]}”选项以添加新条目。

 class ArtistsController < ApplicationController def index @artists = Artist.where("name like ?", "%#{params[:q]}%") results = @artists.map(&:attributes) results < "Add: #{params[:q]}", :id => "CREATE_#{params[:q]}_END"} respond_to do |format| format.html format.json { render :json => results } end end 

我添加了额外的代码来解析id的“新”条目,然后用它们创建一个新的艺术家。 然后再次分配artist_ids。

 post.rb def artist_tokens=(ids) ids.gsub!(/CREATE_(.+?)_END/) do Artist.create!(:name => $1).id end self.artist_ids = ids.split(",") end 

除了仅通过current_user的条目缩小json结果的能力之外,一切都很有效。 我该怎么做呢? 我是否需要在表中存储条目创建者的user_id? 我怎样才能做到这一点?

编辑:模型的关联

 # app/models/user.rb class User  :posts end # app/models/post.rb class Post  :artisanships end # all/models/artist.rb class Artist  :artisanships has_many :posts, :through => :artisanships end # app/models/artisanship.rb class Artisanships  :post end 

编辑:posts_controller.rb

 class PostsController  [:create, :edit, :update, :destroy] before_filter :authorized_user, :only => [:destroy, :edit, :update] def create @user = current_user @post = current_user.posts.build(params[:post]) if @post.save flash[:success] = "Post created!" redirect_to root_path else @feed_items = current_user.feed.paginate(:per_page => "10", :page => params[:page]) render 'pages/home' end end def index @posts = Post.paginate(:page => params[:page]) end def show @post = Post.find(params[:id]) end def edit @post = Post.find(params[:id]) end def update @post = Post.find(params[:id]) respond_to do |format| if @post.update_attributes(params[:post]) format.html { redirect_to(post_path(@post), :notice => 'Post was successfully updated.') } else format.html { render :action => "edit" } end end end def destroy @post.destroy redirect_to root_path end def likers @title = "Likers" @post = Post.find(params[:id]) @likers = @post.likers.paginate(:page => params[:page]) render 'show_likers' end def search if params[:q] query = params[:q] @search = Post.search do keywords query end @posts = @search.results end end private def authorized_user @post = Post.find(params[:id]) redirect_to root_path unless current_user?(@post.user) end 

编辑:尝试alias_method_chain首先设置post的user_id属性。 (没有工作来修复NULL db条目)引用自: Rails 3:a​​lias_method_chain仍然使用?

  def attributes_with_user_id_first=(attributes = {}) # Make sure not to accidentally blank out the important_attribute when none is passed in if attributes.include?(:user_id) self.user_id = attributes.delete(:user_id) end self.attributes_without_user_id_first = attributes end alias_method_chain :attributes=, :user_id_first 

如果您不想修改模型中的任何内容,那么您可以这样做:

 def index @artists = current_user.posts.join("artisianships").join("artists"). where("artisianships.post_id = posts.id"). where("artists.name like ?", "#{params[:q]}"). select("artists.name as name, artists.id as id") results = @artists.map(&:attributes) results << {:name => "Add: #{params[:q]}", :id => "CREATE_#{params[:q]}_END"} respond_to do |format| format.html format.json { render :json => results } end end 

请注意,这里有很多连接,所以不推荐。

要调试为什么Artist.create!(:name => $1, :user_id => self.user_id)不起作用,如果我们能看到更多代码,特别是创建Postaction ,那将会很棒

更新:您是否尝试将PostController#create更改为以下内容,尽管我觉得复杂的代码应该可以正常工作,

 @post = current_user.posts.build if @post.update_attributes(params[:post]) # do something else # do something else end 

我不是一个rails pro而且不懂alias_method_chain因此无法评论为什么它不起作用。

如果你正在使用一些认证解决方案,如设计,清除或authlogic,你可能已经有current_user方法。 因此,在Artist模型中添加一列user_id:integer,然后执行以下操作:

 #User model has_many :artists #Artist model belongs_to :user #Artists controller def index @artists = current_user.artists.where("name like ?", "%#{params[:q]}%") #this answers your question! ... blah blah end 

当然,不要忘记在创建艺术家时设置user_id列。