[英]Really having difficulty with New tokens on token input (from different model)
我正在使用jquery-tokeninput,但是它的一个分支使User
可以为每个Resource
添加新的自定义标记( Tag
)。
此处的示例(向下滚动到标签框并输入几个字母。您可以键入不存在的字母): http : //www.tomsguide.fr/solutions/nouveau_sujet.htm
16,42,'Subway',37,'McDonald\'s',734
我在尝试用Rails处理这个问题时遇到了极大的困难。 这完美地总结了一下 。
到目前为止,这是我所拥有的,并且无法正常工作,可能是由于很多原因,但我没有看到,但是主要原因是我需要创建新的Tag实例但不保存它们,这样我就可以通过某种方式传递它们返回到令牌输入中,并在提交表单时将新标签和新资源一起保存。 当您使用Tag.new时,它不会创建ID。
attr_accessor :tokens_list
# CUSTOM TOKENS
def tag_tokens=(tokens)
self.tokens_list = tokens.split(",")
if new_custom_tokens?
self.tokens_list.each do |token|
tokens_list << token if token.include? "'"
end
end
self.tag_ids = self.tokens_list
end
def new_custom_tokens?
self.tokens_list.each do |token|
return true if token.include? "'"
end
false
end
def create
@title = "Submit Resource"
@resource = Resource.new(params[:resource])
assign_to_global_user?
# CUSTOM TOKENS
if @resource.new_custom_tokens?
custom_token_time_restriction
# Create Tag.new
end
if @resource.valid?
@resource.save
flash[:notice] = "Your link has been successfully submitted."
redirect_to root_url
else
render :action => :new
end
end
def assign_to_global_user?
if user_signed_in?
@resource.user_id = current_user.id
else
@resource.user_id = User.find_by_username("Global_User").id
end
end
private
# CUSTOM TOKENS
def custom_token_time_restriction
limit = 7 # days
if (@resource.user_id != User.global_user_id) and (Time.now - limit.days > User.find(@resource.user_id).created_at)
# TODO: Check if they are anonymous or their account is newer than 7 days
else
flash[:notice] = "You be Logged in to add new tags, and your account must be older than #{limit} days."
render :action => :new
end
end
<div class="field">
<%= f.label :tags %>
<%= f.text_field :tag_tokens, "data-pre" => @resource.tags.to_json(:only => [:id, :name]), :class => :tagbox %>
</div>
我有同样的问题。 这是我所做的:
这是我以json格式返回搜索令牌的函数。
tags = TagMaster.where("name LIKE ?", "%#{params[:q]}%").limit(10)
if tags == []
list << {"id" => "0","name"=>new_tag.rstrip}
else
tags.each { |tag| list << {"id" => tag.id.to_s, "name" => tag.name }}
end
respond_to do |format|
format.json { render :json => list.to_json, :layout => false }
end
现在,这将允许您显示在自动完成下拉菜单中键入的任何内容,并且在单击时它将显示为令牌。
现在,您将无法再添加任何自定义标记,因为任何不在数据库中的标记都将返回id 0,因此此时仅允许一个自定义标记。
对于这个问题,我做了以下工作。
var k = jQuery.noConflict();
k("#project_tags").tokenInput("tag_list", {
hintText: "Enter Tags for your Project",
noResultsText: "No Such Tags",
searchingText: "Looking for your Tags",
preventDuplicates: true,
theme: "facebook",
onAdd: function (item) {
if (item.id == '0') {
k.ajax({
url: '/add_project_tag',
data: { name: item.name },
success:function(data) {
k("#project_tags").tokenInput("add", {id: data, name: item.name});
k("#project_tags").tokenInput("remove", {id: '0' });
}
});
}
}
});
如您所见,在这里我将add_project_tag存入该自定义标签到数据库中,并返回该已插入标签的ID。 因此,现在您只需使用其ID添加相同的令牌,并使用0删除令牌。
因此,现在将不会有任何标记,其值为0,并且您可以根据需要添加任意数量的新标记。
希望这可以帮助。 如果还有更多并发症,请提出您的问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.