Заставить этот f.autocomplete_field и эту модель Tag работать вместе? - PullRequest
0 голосов
/ 27 февраля 2012

У меня есть модель Post и модель Tag (последняя имеет атрибут с именем :name). Модель Post имеет attr_accessor с именем :tag_name, который я добавил для rails3-jquery-autocomplete Работа плагина:

post.rb:

class Post < ActiveRecord::Base
  attr_accessible :title, :content, :tag_name

  has_and_belongs_to_many :tags

  def tag!(tags)
    tags = tags.split(" ").map do |tag|
      Tag.find_or_create_by_name(tag)
    end
    self.tags << tags
  end
end

tag.rb:

class Tag < ActiveRecord::Base
  has_and_belongs_to_many :posts
end

posts_controller.rb:

  def create
    @user = current_user
    @post = @user.posts.new(params[:post])

    if @post.save
      redirect_to @post, notice: 'post was successfully created.'
    else
      render action: "new"
    end

    @post.tag!(params[:tags])
  end

_form.html.erb

<%= f.autocomplete_field :tag_name, autocomplete_tag_name_posts_path, :"data-delimiter" => ' ' %>

С кодом выше автозаполнение работает, но когда я отправляю форму, я получаю эту ошибку: неопределенный метод `split 'для nil: NilClass.

Я не уверен, что делать с f.autocomplete_field. Перед тем как раньше подавать идеально так:

<%= text_field_tag :tags, params[:tags] %>

(я взял это из этого учебника)

Теперь я не знаю, как снова успешно отправить форму и создать теги для сообщений. Я тоже не знаю, что мне следует изменить в теге пост-модели! метод и действие контроллера create .

Есть предложения?

1 Ответ

1 голос
/ 27 февраля 2012

В действии create строка -

@post.tag!(params[:tags])

ожидает params[:tags].Нет такого параметра, потому что когда вы меняете

<%= text_field_tag :tags, params[:tags] %>

на

<%= f.autocomplete_field :tag_name, autocomplete_tag_name_posts_path, :"data-delimiter" => ' ' %>

, параметры, которые действительно содержат теги, будут в params[:post][:tag_name].Это потому, что html, созданный двумя, имеет разные атрибуты имени для текстового поля.В первом случае это tags, а во втором - tag_name.

Поэтому изменение его на:

@post.tag!(params[:post][:tag_name])

должно работать

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...