Действительно возникают трудности с новыми токенами при вводе токена (из другой модели)

Я использую jquery-tokeninput, но его ответвление позволяет User добавлять новые пользовательские токены (Tag) для каждого Resource.

Пример здесь (прокрутите вниз до поля тега и введите несколько букв. Вы можете ввести несуществующие): http://www.tomsguide.fr/solutions/nouveau_sujet.htm

Текущее возвращаемое значение из вилки, которую я использую, таково (новое значение в кавычках):

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

Мне очень трудно справиться с этим в Rails. Это прекрасно подводит итог.

Это то, что у меня есть до сих пор, и оно не работает, вероятно, по многим причинам, которые я не вижу, но основная причина в том, что мне нужно создавать новые экземпляры тегов, но не сохранять их, чтобы я мог как-то передать их обратно во ввод токена и сохраните новые теги вместе с новым ресурсом при отправке формы. Однако когда вы используете Tag.new, он не создает идентификатор.

ресурс.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 (для ресурса#новый)

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

person Tallboy    schedule 27.05.2012    source источник


Ответы (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

Теперь это позволит показать вам все, что вы вводите в раскрывающемся списке автозаполнения, и при нажатии оно будет отображаться как токен.

Теперь вы не можете добавлять дополнительные пользовательские токены, потому что любой токен, отсутствующий в базе данных, будет возвращать идентификатор 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, где я сохраняю этот пользовательский тег в базе данных, и он возвращает идентификатор этого вставленного тега. Итак, теперь вы просто добавляете тот же токен с его идентификатором и удаляете токен с 0.

Так что теперь не будет ни одного токена с 0, и вы можете добавить столько новых токенов, сколько захотите.

Надеюсь это поможет. Кидайте свои вопросы, если будут еще сложности.

person Kashyap    schedule 29.06.2012
comment
Это будет работать нормально, но в следующем сценарии могут возникнуть небольшие проблемы. если ruby ​​on rails хранится в БД как токен, и теперь вы хотите добавить rails как токен. Это решение не позволит вам добавить рельсы. Для этого вы можете добавить любой тип пользователя в json. Для лучшего решения вы можете проверить, совпадает ли то, что набрал пользователь, с одним из результатов, возвращаемых вашим sql-подобным запросом. - person Kashyap; 30.06.2012