Тегирование с нуля: проблема запросов к базе данных

@saverio удалось ответить на этот вопрос запроса базы данных на Tagged from Scratch: the Проблема с облаком тегов

Теперь я пытаюсь подключить систему тегов с помощью jQuery-tokenInput для динамического создания и поиска тегов, как на http://railscasts.com/Episodes/258-token-fields-revised.

  • Я предполагаю, что это проблема с запросом к базе данных Posgresql.
  • У меня правильно установлен Postgresql
  • jQuery-tokenInput находится на своем месте в Application.js //= require jquery.tokeninput
  • Каким-то образом он может загружать теги из того, что уже было в базе данных, но не может динамически запрашивать те же слова, как указано ниже, в коде pictures.js.coffee.

После всех соответствующих областей:

pictures.js.coffee

jQuery ->
  $('#picture_tag_tokens').tokenInput '/tags.json'
  theme: 'facebook'
  prePopulate: $('#picture_tag_tokens').data('load')

/views/pictures/_form

<div class="field">
  <%= f.label :tag_tokens, "Tags (separated by commas)" %><br />
  <%= f.text_field :tag_tokens, data: {load: @picture.tags} %>
</div>

Тут моя логика немного сбивается

/models/picture.rb

class Picture < ActiveRecord::Base
  attr_accessible :description, :title, :tag_tokens
  has_many :taggings
  has_many :tags, through: :taggings
  attr_reader :tag_tokens

  #The **below** is the relevant part for the #view/pictures/_form
  def tag_tokens=(tokens)
    self.tag_ids = Tag.ids_from_tokens(tokens)
  end

  def self.tagged_with(name)
    Tag.find_by_name!(name).pictures
  end

  def self.tag_counts
    Tag.select("tags.*, count(taggings.tag_id) as count").
    joins(:taggings).group("tags.id")
  end

  def tag_list
    tags.map(&:name).join(", ")
  end

  def tag_list=(names)
    self.tags = names.split(",").map do |n|
      Tag.where(name: n.strip).first_or_create!
    end
  end
end

Ниже я мог понять, что не могу запросить базу данных

/models/tag.rb

class Tag < ActiveRecord::Base
  attr_accessible :name
  has_many :taggings
  has_many :pictures, through: :taggings

  def self.tokens(query)
    tags = where("name like ?", "%#{query}%")
    if tags.empty?
      [{id: "<<<#{query}>>>", name: "New: \"#{query}\""}]
    else
      tags
    end
  end

  def self.ids_from_tokens(tokens)
    tokens.gsub!(/<<<(.+?)>>>/) { create!(name: $1).id }
    tokens.split(',')
  end
end

И так я установил поведение контроллера тегов.

#controllers/tags_controller.rb

class TagsController < ApplicationController
  def index
   @tags = Tag.all
   respond_to do |format|
     format.html
     format.json { render json: @tags.tokens(params[:q]) }
   end
  end
end

Итак, почему я не могу выполнить запрос к Postgresql и не могу создать или найти динамически?


person CelsoDeSa    schedule 10.10.2012    source источник


Ответы (2)


Я внедрил достаточно простое решение: используя Gem ActsAsTaggableOn с ввод токена jQuery

Если вы пройдете по приведенному ниже алгоритму, вы поймете, что приведенный выше вопрос был просто неверным представлением о конфигурации между системой тегов и jQuery. следующие шаги помогут вам на вашем пути:

1 Поместите файлы jQuery Tokeninput в нужные места:

Vendor > assets > javascripts > jquery-tokeninput.js

Vendor > assets > stylesheets > token-input-facebook.css (and 2 others)

2 в файле в apps > assets > javascripts > application.js напишите эту строку перед //= require_tree . это заставляет JavaScript работать

//= require jquery.tokeninput

3 в файле в apps > assets > stylesheets > application.css.scss прямо перед *= require_tree . это заставит CSS работать

*= require token-input-facebook

4 Поместите gem 'acts-as-taggable-on' на gemfile и запустите установку пакета и выполните те же действия, что и здесь. .

5 создайте пользовательский маршрут в routes.rb для индекса контроллера тегов (мы собираемся определить), чтобы включить свойство json

get '/tag.json', to: 'tag#index', as: :pictures_tags

Следующий код и приведенный выше позволяют нам правильно общаться с базой данных.

6 запустите rails g tag controller index и в этом файле напишите следующее:

#tag_controller.rb

индекс защиты

     query = params[:q]
     query = query.chomp(" ").downcase
     @tags = ActsAsTaggableOn::Tag.where("tags.name LIKE '%#{query}%' OR tags.name LIKE '#{query}'")

if @tags.empty?
    ActsAsTaggableOn::Tag.find_or_create_by_name_and_id(id: "#{query}", name: "#{query}")
else 
    respond_to do |format|
        format.html
        format.json { render json: @tags.collect{ |tag| {id: tag.name, name: tag.name } } }
    end
 end            

конец

7 и, наконец, склейте все кодом, который вы разместите на app > assets > javascript > your_file_with_tags.js.coffee

#your_file_with_tags.js.coffee

jQuery ->

$('#field_with_tag_list').tokenInput '/tag.json'

    theme: 'facebook'

    prePopulate: $('#field_with_tag_list').data('load')

    preventDuplicates: true

    resultsLimit: 3

    tokenLimit: 7

    tokenDelimiter: ","

    searchingText: "hit space for New Tag"

PS: #field_with_tag_list находится в вашем представлении (обычно частичном _form), которое вы генерируете для определения тегов следующим образом: (#controller_tag_list), т.е. #pictures_tag_list

<div class="field">

`<%= f.label :tag_list %><br />`

`<%= f.text_field :tag_list, data: {load: @picture.tag_list.map {|tag| { id: tag, name: tag }}} %>`

</div>

Все это экспериментальный код, я уверен, что он вам поможет =]

person CelsoDeSa    schedule 13.10.2012

Попробуйте на своем контроллере:

  @tags = Tag.order(:name)

Это все.

person Julio Ahuactzin    schedule 22.11.2012