ruby-on-rails ruby ruby-on-rails-4 acts-as-taggable

Problema al guardar etiquetas en Ruby on Rails 4 con acts_as_taggable



ruby-on-rails ruby-on-rails-4 (2)

Estoy intentando implementar act_as_taggable en mi aplicación Rails 4 (en el modelo de microposts), pero el programa no guarda las etiquetas, que por lo tanto no se pueden ver. Las tablas de etiquetas y etiquetas se han rastreado y existen en la base de datos, pero ninguno de los códigos que implementé parece guardar una etiqueta o crear una etiqueta cuando se envía el formulario. Seguí los pasos de este tutorial casi exactamente, pero parece que algo no funciona.

No estoy seguro de si se trata de un problema centrado en los rieles 4 y / o está conectado a la falta del código ''attr_accessible'' utilizado en los rieles. Dado que el ejemplo del código no especifica agregar nada a la tabla de microposts, solo puedo asumir que la conexión se realiza en otro lugar, pero ¿dónde y cómo debo corregir eso? No lo sé (¿en microposts_helper.rb quizás?).

Gracias por adelantado. Cualquier ayuda es muy apreciada.

Fragmentos de código relevantes

Gemfile

... gem ''acts-as-taggable-on'', ''~> 2.4.1'' ...

microposts.rb

class Micropost < ActiveRecord::Base belongs_to :user acts_as_taggable acts_as_taggable_on :tags ... end

microposts_controller.rb

before_action :signed_in_user, only: [:create, :destroy] before_action :correct_user, only: :destroy def index if params[:tag] @microposts = Micropost.tagged_with(params[:tag]) else @microposts = Micropost.all end end def create @micropost = current_user.microposts.build(micropost_params) if @micropost.save flash[:success] = "Micropost created!" redirect_to current_user else @feed_items = [] render ''users/show'' end end def destroy @micropost.destroy redirect_to user_url end def tagged if params[:tag].present? @microposts = Micropost.tagged_with(params[:tag]) else @microposts = Micropost.postall end end private def micropost_params params.require(:micropost).permit(:content) end def correct_user @micropost = current_user.microposts.find_by(id: params[:id]) redirect_to user_url if @micropost.nil? end end

microposts_helper.rb

module MicropostsHelper include ActsAsTaggableOn::TagsHelper end

_microposts_form.html.rb

<%= form_for(@micropost) do |f| %> ... <div class="field"> ... <%= f.label :tags %> <%= f.text_field :tag_list %> </div> <%= f.submit "Post", class: "btn btn-large btn-primary" %> <% end %>

_micropost.erb.html

<li> <span class="content"><%= micropost.content %></span> <span class="tags"> <%= micropost.tag_list %> </span> ... </li>

schema.rb

... create_table "microposts", force: true do |t| t.string "content" t.integer "user_id" t.datetime "created_at" t.datetime "updated_at" end add_index "microposts", ["user_id", "created_at"], name: "index_microposts_on_user_id_and_created_at" ... create_table "taggings", force: true do |t| t.integer "tag_id" t.integer "taggable_id" t.string "taggable_type" t.integer "tagger_id" t.string "tagger_type" t.string "context", limit: 128 t.datetime "created_at" end add_index "taggings", ["tag_id"], name: "index_taggings_on_tag_id" add_index "taggings", ["taggable_id", "taggable_type", "context"], name: "index_taggings_on_taggable_id_and_taggable_type_and_context" create_table "tags", force: true do |t| t.string "name" end ...

routes.rb

Dev::Application.routes.draw do ... resources :microposts, only: [:create, :destroy] ... match ''tagged'', to: ''microposts#tagged'', :as => ''tagged'', via: ''get'' end


Creo que, la variable de entrada para las etiquetas en el formulario debería tags_list . es decir

<%= form_for(@micropost) do |f| %> ... <div class="field"> ... <%= f.label :tags %> <%= f.text_field :tags_list %> </div> <%= f.submit "Post", class: "btn btn-large btn-primary" %> <% end %>

Y también actualice el _micropost.erb.html para usar tags_list .

O simplemente puede actualizar su modelo con el uso de un atributo de etiqueta, es decir, ''acts_as_taggable_on :tag ''


Si entiendo la pregunta correctamente, todo lo que debes hacer es, básicamente, contar el modelo de protección recomendado para los parámetros (parámetros_fuertes) sobre la gema actos como etiquetas. Ya estás a mitad de camino con esto:

private def micropost_params params.require(:micropost).permit(:content) end [...] end

Solo agrega:

private def micropost_params params.require(:micropost).permit(:content, :tag_list => []) end [...] end

Además, es posible que desee agregar una cosa a su archivo routes.rb. Reemplazar la línea:

resources :microposts, only: [:create, :destroy]

con:

resources :microposts, only: [:create, :destroy, :tag]

Avíseme si estas sugerencias funcionan bien. ¡Buena suerte!