我已經成功地得以實施的新的藝術家條目加入其中並沒有包含在瑞安貝茨railscast#258 http://railscasts.com/episodes/258-token-fieldsRails的:使用jQuery tokeninput(railscast#258)來創建新條目
所以,換句話說,用戶可以輸入一個藝術家的名字,將使用jquery tokinput自動完成。不過,我希望自動填充結果僅顯示由該用戶創建的藝術家名稱。
這是否有意義?一個更好,更容易理解的例子是一個collection.rb,用戶創建帖子併爲帖子指定一個「集合」,但他們應該只能將帖子添加到他們自己創建的集合中。
這是後形式artist_tokens作爲一個虛擬的屬性:
<%= form_for @post, :validate => true, :html => {:multipart => true} do |f| %>
<%= render 'shared/error_messages', :object => f.object %>
<div class="field">
<%= f.label :title, 'Title:' %><br />
<%= f.text_field :title %><br />
<%= f.label :artist_tokens, "Artists" %><br />
<%= f.text_field :artist_tokens, "data-pre" =>
@post.artists.map(&:attributes).to_json %>
</div>
<div class="actions">
<%= f.submit "Submit" %>
</div>
<% end %>
這由進入artist_tokens場後窗體上的價值發現藝人,我也添加了一些選項「添加{PARAMS [:q]}「添加新條目。
class ArtistsController < ApplicationController
def index
@artists = Artist.where("name like ?", "%#{params[:q]}%")
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
我添加了額外的代碼來按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 < ActiveRecord::Base
has_many :posts
has_many :artists, :through => :posts
end
# app/models/post.rb
class Post < ActiveRecord::Base
belongs_to :user
has_many :artisanships
has_many :artists, :through => :artisanships
end
# all/models/artist.rb
class Artist < ActiveRecord::Base
has_many :artisanships
has_many :users, :through => :artisanships
has_many :posts, :through => :artisanships
end
# app/models/artisanship.rb
class Artisanships < ActiveRecord::Base
belongs_to :post
belongs_to :artist
has_one :user, :through => :post
end
編輯:posts_controller.rb
class PostsController < ApplicationController
before_filter :authenticate_user!, :only => [: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先設定後的USER_ID屬性。 (沒有工作來解決NULL DB項) 從referneced:Rails 3: alias_method_chain still used?
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
你剛纔提到它的'collection.rb'是什麼,但稍後會完全跳過它。 「Post」和「Artist」有什麼關係?你到底想做什麼? – rubish
郵政和藝術家有一個名爲artisanships的聯合表(使用artist_ids和post_ids)。如果您熟悉jquery tokeninput,我添加了添加新條目的功能。我希望自動完成只包含用戶創建的條目。 –
Collection.rb不存在這只是一個例子,以更好地理解我想如何使用jQuery的tokeninput,你可以想到集合代替藝術家。用戶創建一個帖子並鍵入一個集合名稱,如果它的新集合選擇了「添加:」新集合名稱「,如果它是一箇舊集合,他們只選擇它。如果用戶創建集合,他們只能從他們自己的集合中選擇更有意義嗎? –