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!