【问题标题】:Really having difficulty with New tokens on token input (from different model)对令牌输入的新令牌确实有困难(来自不同的模型)
【发布时间】:2012-05-27 21:01:17
【问题描述】:

我使用 jquery-tokeninput,但它的一个分支允许 User 为每个 Resource 添加新的自定义令牌 (Tag)。

此处示例(向下滚动到标签框并输入几个字母。您可以输入不存在的字母):http://www.tomsguide.fr/solutions/nouveau_sujet.htm

fork I'm using 的当前返回值是这样的(引号中的新值):

16,42,'Subway',37,'McDonald\'s',734

我很难在 Rails 中处理这个问题。 This sums it up perfectly.

这是我到目前为止所拥有的,它不起作用,可能有很多我没有看到的原因,但主要原因是我需要创建新的 Tag 实例但不保存它们,这样我可以以某种方式将它们传递回令牌输入,并在提交表单时将新标签与新资源一起保存。但是,当您使用 Tag.new 时,它不会创建 ID。

resource.rb

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

resources_controller.rb

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

new.html.erb(用于资源#new)

<div class="field">
  <%= f.label :tags %>
  <%= f.text_field :tag_tokens, "data-pre" => @resource.tags.to_json(:only => [:id, :name]), :class => :tagbox %>
</div>

【问题讨论】:

    标签: ruby-on-rails ruby ruby-on-rails-3.1 jquery-tokeninput


    【解决方案1】:

    我遇到了同样的问题。这就是我所做的:

    这是我以 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 的令牌,您可以添加任意数量的新令牌。

    希望这会有所帮助。如果有更复杂的问题,请提出您的问题。

    【讨论】:

    • 这可以正常工作,但在以下情况下可能会出现小问题。如果“ruby on rails”作为令牌存储在数据库中,现在您希望“rails”作为令牌添加。此解决方案不允许您添加导轨。为此,您可以将任何用户类型添加到 json。为了获得更好的解决方案,您可以检查用户输入的内容是否与您的 sql 查询返回的结果之一完全相同。
    猜你喜欢
    • 2020-10-15
    • 1970-01-01
    • 1970-01-01
    • 2018-10-11
    • 2013-01-27
    • 1970-01-01
    • 2018-04-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多